-
Notifications
You must be signed in to change notification settings - Fork 37
/
Copy patharray_list.hpp
182 lines (158 loc) · 5.58 KB
/
array_list.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#pragma once
#include <algorithm> // copy
#include <cassert> // assert
#include <stdexcept> // out_of_range
#include <string> // to_string
namespace itis {
/**
* Структура данных "массив переменной длины".
* Является одной из реализаций ADT Abstract List.
*/
struct ArrayList {
public:
// default constructor
ArrayList() : capacity_{kInitCapacity}, data_{new char[kInitCapacity]} {}
/**
* Создание массива переменной длины.
*
* @param capacity - начальная емкость массива.
*/
explicit ArrayList(int capacity) {
// To Do ...
}
~ArrayList() {
// To Do ...
}
/**
* Добавление элемента в конец массива.
* Сложность операции - O(1) или O(n) в зависимости от необходимости увеличения размеров массива.
*
* При недостаточной емкости (capacity) массива осуществляется его расширение с сохранением предыдущих элементов.
* @param element - значение элемента
*/
void PushBack(char element) {
// To Do ...
}
/**
* Вставка элемента в массив по индексу.
* Сложность операции - O(n).
*
* Все элементы, находящиеся на позиции вставки и справа от нее, сдвигаются на единицу вправо.
* При недостаточной емкомсти (capacity) массива осуществляется его расширение с сохранением предыдущих элементов.
*
* @param index - позиция для вставки
* @param element - значение элемента
*
* @throws выбрасывает ошибку out_of_range при работе с некорректным индексом.
*/
void Insert(int index, char element) {
check_out_of_range(index);
// To Do ...
}
/**
* Удаление элемента массива по индексу.
* Сложность операции - O(n).
*
* Все элементы, стоящие справа от удаленного элемента сдвигаются влево на единицу.
*
* @param index - индекс удаляемого элемента
* @return значение удаленного элемента
*
* @throws выбрасывает ошибку out_of_range при работе с некорректным индексом.
*/
char Remove(int index) {
check_out_of_range(index);
// To Do ...
return {};
}
/**
* Удаление всех элементов массива.
* Сложность операции - O(1).
*
* Емкость (capacity) массива остается прежним.
*/
void Clear() {
// To Do ...
}
/**
* Получение элемента массива по индексу.
* Сложность операции - O(1).
*
* @param index - индекс элемента
* @return значение элемента по индексу
*
* @throws выбрасывает ошибку out_of_range при работе с некорректным индексом.
*/
char Get(int index) const {
check_out_of_range(index);
// To Do ...
return {};
}
/**
* Вычисление индекса элемента.
* Сложность операции - O(n).
*
* @param element - значение элемента
* @return индекс элемента или -1 при остутствии элемента в массиве
*/
int IndexOf(char element) const {
// To Do ...
return {};
}
/**
* Проверка наличия элемента в массиве.
* Сложность операции - O(n).
*
* @param element - значение элемента
* @return при наличии элемента - true, иначе - false
*/
bool Contains(char element) const {
// To Do ...
return {};
}
/**
* Проверка наличия хотя бы одного элемента в массиве.
* Сложность операции - O(1).
*
* @return при наличии хотя бы одного элемента - true, иначе - false
*/
bool IsEmpty() const {
// To Do ...
return {};
}
int GetSize() const {
return size_;
}
int GetCapacity() const {
return capacity_;
}
private:
/**
* Увеличение емкости массива.
* Сложность операции - O(n).
*
* Элементы массива должны сохраниться на своих позициях.
*
* @param new_capacity - новая емкость массива (должна быть больше предыдущей)
*/
void resize(int new_capacity) {
assert(new_capacity > capacity_);
// To Do ...
}
public:
static constexpr int kInitCapacity = 10;
static constexpr int kCapacityIncreaseCoefficient = 10;
private:
int size_{0}; // кол-во элементов
int capacity_{0}; // емоксть
char *data_{nullptr};
private:
void check_out_of_range(int index) const;
};
// определение методов
void ArrayList::check_out_of_range(int index) const {
if (index >= size_) {
throw std::out_of_range("index is out of range: " + std::to_string(size_));
}
}
} // namespace itis