Анимация
JavaScript


Главная  Библионтека 

0 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 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239

Интерфейс векторов и деков почти не отличается. Если в программе не используются специфические возможности вектора или дека, вы можете легко опробовать оба контейнера.

Операции над деками

в табл. 6.9-6,11 перечислены все операции, поддерживаемые деками.

Таблица 6.9. Конструкторы и деструктор деков Операция Описание

deque<Elem> с Создает пустой дек, не содержащий ни одного элемента

deque<Eiem> с1(с2) Создает копию другого дека того же типа (с копированием всех

элементов)

deque<Elem> с(п) Создает дек из п элементов, создаваемых конструктором по умолчанию

deque<Elenfi> c(n,elem) Создает дек, инициализируемый п копиями эпемента elem deque<Elem> c(beg,end) Создает дек, инициализируемый элементами интервала [beg,end) c.~deque<Elem>() Уничтожает асе элементы и освобождает память

Таблица 6.10. Немодифицирующие операции над деками Операция Описание

c.size() Возвращает фактическое количество элементов

C.emptyO Проверяет, пуст ли контейнер (эквивалент size()==0, но иногда выполняется быстрее)

c.max size() Возвращает максимально возможное количество элементов

с1 == с2 Проверяет равенство с1 и с2

с1 != с2 Проверяет неравенство с1 и с2 (эквивалент !(с1==с2))

с1 < с2 Проверяет, что с1 меньше с2

с1 > с2 Проверяет, что с1 больше с2 (эквивалент с2<с1)

с1 <= с2 Проверяет, что с1 не больше с2 (эквивалент !(с2<с1))

с1 >= с2 Проверяет, что с1 не меньше с2 (эквивалент !(с1<с2))

c.at(idx) Возвращает элемент с индексом idx (при недопустимом значении индекса генерируется исключение out of range)

c[idx] Возвращает элемент с индексом idx (без интервальной проверки!)

C.frontO Возвращает первый элемент (без проверки его существования!)

с.ЬаскО Возвращает последний элемент (без проверки его существования!)

c.rbegin() Возвращает обратный итератор для первого элемента при переборе в обратном направлении

c.rend() Возвращает обратный итератор для позиции эа последним элементом

при переборе в обратном направлении



Таблица 6.11. Модифицирующие операции над деками

Операция

Описание

с1 = с2

c.assign(n,elem)

c.assign(beg,end)

cl,swap(c2)

swap(cl,c2)

c.insert(pos,elem)

c.insert(pos,n,elem)

c. i nsert( pos, beg,end)

c.push back(elem)

c.pop back()

c.push front(elem)

c.pop front()

c.erase(pos)

c.erase(beg,end)

c.resize(num)

c.resize(num,elem)

C.clearO

Присваивает cl все элементы c2 Присваивает п копий элемента elem Присваивает элементы интервала [beg,end) Меняет местами содержимое с1 и с2 То же, но в форме глобальной функции

Вставляет копию elem в позицию итератора pos и возвращает позицию нового элемента

Вставляет п копий elem в позицию итератора pos (и не возвращает значения)

Вставляет а позицию итератора pos копию всех элементов интервала [beg,end) (и не возвращает значения)

Присоединяет копию elem в конец дека

Удаляет последний элемент (не возвращая его)

Вставляет копию elem в начало дека

Удаляет первый элемент (не возвращая его)

Удаляет элемент в позиции итератора pos и возвращает позицию следующего элемента

Удаляет все элементы из интервала [beg,end) и возвращает позицию следующего элемента

Приводит контейнер к размеру num (если slze() при этом увеличивается, новые элементы создаются своим конструктором по умолчанию)

Приводит контейнер к размеру num (если size() при этом увеличивается, новые элементы создаются как копии elem)

Удаляет асе элементы (контейнер остается пустым)

Операции деков отличаются от операций векторов только в следующих отношениях:

О деки не поддерживают функции, связанные с емкостью (capacityO и reserve());

О в деках определены прямые функции вставки и удаления первого элемента (push front() и рор Ьаск()).

Поскольку остальные операции остались без изменений, здесь они не рассматриваются. За описаниями обращайтесь на с. 159.

При работе с деками необходимо учитывать следующее.

О Функции обращения к элементам (кроме at()) не проверяют правильность индексов и итераторов.

О Вставка или удаление элементов может привести к перераспределению памяти. Это означает, что в результате любой вставки или удаления могут стать недействительными все указатели, ссылки и итераторы, ссылающиеся



на другне элементы дека. Дагпюе утверждение не относится к вставке элементов в нача.т1о или конец дека - в этом случае ссылки и указатели на элементы (но не итераторы!) остаются действительными.

Обработка исключений

в принципе возможности обработки исключений в деках аналогичны соответствующим возможностям векторов (см. с, 164). Дополнительные операции push front() и pop front() ведут себя аналогично операциям push back() и рор Ьаск() соответственно. Таким образом, стандартная библиотека С++ обеспечивает следующие гарантии:

О если при вставке элемента функцией push back() или push front() происходит исключение, эти функции не вносят изменений;

О функции рор Ьаск() и pop front() не генерируют исключений.

На с. 148 приведены общие сведения об обработке исключений в STL, а на с. 254 перечислены все контейнерные операции, для которых предоставляются особые гарантии в отношении исключений.

Примеры использования деков

Ниже приводится простой пример, демонстрирующий практическое применение деков.

cont/dequel,cpp #1nclude <iostream> #include <deque> #1nclude <string> finclude <algor1thni> using namespace std:

int mainO {

Создание пустого дека для хранения строк deque<string> col 1:

Вставка нескольких элементов coll.assign (3, stringCstring")); coll.push back ("last string"): coll.push front ("first string");

Вывод элементов с разделением символом новой строки сору (coll.beginO. coll.endO.

ostreami terator<stri ng>(cout."\n")): cout « endl:

Удаление первого и последнего элементов



0 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 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239