Анимация
JavaScript
|
Главная Библионтека v.swap(tmp): Перестановка внутренних данных векторов Емкость вектора можно уменьшить даже без вызова этой функции, просто выполнив следующую команду; Уменьшение емкости вектора v аля типа Т std::vector<T>Cv).swap(v); Но не следует забывать, что после вызова функции swap() все ссылки, указатели и итераторы переключаются на новый контейнер. Они продолжают ссылаться па те элементы, иа которые они ссылались первоначально. Значит, после вызова функции shrinkCapacity() вес ссылки, указатели и итераторы становятся недействительными. Операции над векторами Операции создания, копирования и уничтожения в табл. 6.2 перечислены конструкторы и деструктор векторов. Векторы создаются с инициализацией элементов или без нее. Если передается только размер, элементы создаются конструктором по умолчанию. Обратите внимание: явный вызов конструктора по умолчанию также инициализирует базовые тины (в частности, int) нулями; эта особенность языка описана на с. 30. Некоторые из возможных источников инициализации упоминаются на с. 154. Таблица 6.2. Конструкторы и деструкторы векторов Операция Описание vector<Elem> с Создает пустой вектор, не содержащий ни одного элемента vector<Elem> с1(с2) Создает копию другого вектора того же типа (с копированием всех элементов) vector<Elem> с{п) Создает вектор из п элементов, создаваемых конструктором по умолчанию vector<Elem> cCn,elem) Создает вектор, инициализируемый п копиями элемента elem vector<Elem> c(beg, end) Создает вектор, инициализируемый элементами интервала [beg,end) c.~vector<Elem>() Уничтожает все элементы и освобождает память Немодифицирующие операции над векторами в табл. 6.3 перечислены все операции, выполняемые без модификации вектора. Дополнительные замечания приведены на с. 154 и 157. Компилятор может посчитать эту команду неправильно!, потому что в ней неконстантная функция класса вызывается для временного значения. Однако па самом деле стандарт С++ позволяет вызывать неконстантные функции классов для временных значений. Таблица 6.3. Немодифицирующие операции над векторами Операция Описание csizef) c.emptyO c.max sizeO capacityO reserveO cl == c2 cl! = c2 cl < c2 cl > c2 cl <= c2 cl >= c2 Возвращает фактическое количество элементов Проверяет пуст ли контейнер (эквивалент size()==0, но иногда выполняется быстрее) Возвращает максимально возможное количество элементов Возвращает максимально возможное количество элементов без перераспределения памяти Увеличивает емкость вектора, если текущая емкость меньше заданной Проверяет равенство с1 и с2 Проверяет неравенство с1 и с2 (эквивалент !(с1==с2)) Проверяет, что с1 меньше с2 Проверяет, что с1 больше с2 (эквивалент с2<с1) Проверяет, что с1 не больше с2 (эквивалент !(с2<с1)) Проверяет, что с1 не меньше с2 (эквивалент !(с1<с2)) Присваивание в табл. 6.4 перечислены операции присваивания новых элементов с одновременным удалением старых. Набор функций assign() соответствует набору конструкторов класса. При присваивании могут использоваться разные источники (контейнеры, массивы, стандартный входной поток данных) - по аналогии с источниками, используемыми при вызове конструкторов (см. с. 154).
Все операции присваивания вызывают конструктор по умолчанию, копирующий конструктор, оператор присваивания и/или деструктор типа элемента в зависимости от того, как изменяется количество элементов в контейнере. Пример: std::list<Elem> 1: std::vector<Elem> coll: Функция reserveO изменяет вектор, поскольку в результате ее выполнения становятся недействительными ссылки, указатели и итераторы. Тем по менее она включена в таблицу, потому что вызов reserveO пе .меняет логаческого содержимого контейнера. Занести в соП копию содержимого 1 coll.assign(1 .beginO.1 .endO): Обращение к элементам в табл. 6.5 перечислены все операции прямого обращения к элементам векторов. Как принято в С и С++, первому элементу вектора соответствует индекс О, а последнему - индекс size()-l. Таким образом, тг-му элементу соответствует индекс п-1. Для неконстантных векторов эти операции возвращают ссылку на элемент и поэтому могут использоваться для модификации элементов (при условии, что модификация не запрещена по другим причинам). Таблица 6.5. Операции обращения к элементам вектора Операция Описание c.at(idx) Возвращает элемент с индексом idx (при недопустимом значении индекса генерируется исключение out of range) c[tdx] Возвращает элемент с индексом idx (без интервальной проверки!) c.frontO Возвращает первый элемент (без проверки его существования!) с.Ьаск() Возвращает последний элемент (без проверки его существования!) Самый важный аспект для вызывающей стороны - наличие или отсутствие интервальной проверки при обращении к элементу. Такая проверка выполняется только функцией at(). Если индекс не входит в интервал допустимых значений, генерируется исключение out„of range (см. с. 45). Остальные функции выполняются без проверки, и интервальные ошибки приводят к непредсказуемым последствиям. Вызов оператора [], функций front() и Ьаск() для пустого контейнера всегда приводит к непредсказуемым постедствиям. std; :vector<EleiTi> coll; Пустой вектор! coll[5] = elem: ОШБКА ВРЕМЕНИ ВЫПОЛНЕНИЯ std;:cout « coll .frontO; ОШИБКА ВРЕМЕНИ ВЫПОЛНЕНИЯ Следовательно, перед вызовом оператора [] необходимо убедиться в том, что индекс имеет допустимое значение, а перед вызовом функции front() или Ьаск() - что контейнер не пуст: std::vector<Elem> coll: Пустой вектор! if (coll,SizeO > 5) { coll[5] = elem: OK if (!coll .emptyO) { cout « coll .frontO; OK coll.at(5) = elem; Генерирует исключение out of range 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 |