Анимация
JavaScript
|
Главная Библионтека оператора индексирования (см. с. 161). Кроме того, стандарт требует, чтобы происходили только стандартные исключения - такие, как bad alloc при нехватке памяти, или исключения при выполнении пользовательских операций. Если функции, вызванные вектором (функции, о]1ределенные при определении тина элемента или переданные пользователем), инициируют исключения, стандартная библиотека С++ гарантирует следующее. О Если исключение происходит при вставке элемента функцией push back(), эта функция пе вносит изменений в контейнер. О Если операции копирования (копирующий конструктор и оператор присваивания) не генерируют исключений, то функция insert() либо выполняется успешно, либо не вносит изменений. О Функция рор Ьаск() не генерирует исключений. О Если операции копирования (копирующий конструктор и оператор присваивания) не генерируют исключений, то функции erase() и с1еаг() тоже ие генерируют исключений. О Функция swapO не генерирует исключений. О Если используемые элементы не генерируют исключений во время операций копирования (копирующий конструктор и оператор присваивания), то любая операция либо выполняется успешно, либо не вносит изменений в контейнер. Такими элементами могут быть «обычные данные», то есть типы, не использующие специальные возможности С++. Например, любая простая структура С относится к «обычным данным». Все перечисленные гарантии основаны на том, что деструкторы не генерируют исключения. На с. 148 приведены общие сведения об обработке исключений в STL, а на с. 254 перечислены все контейнерные операции, для которых предоставляются особые гарантии в отношении исключений. Примеры использования векторов Ниже приведен простой пример, демонстрирующий практическое применение векторов. cont/vectorl,cpp finclude <iostream> finclude <vector> finclude <string> finclude <algorithm> using namespace std: int mainO { Создание пустого вектора для хранения строк vector<string> sentence; Резервируем память для пяти эленентов. чтобы предотвратить перераспределение sentence.reserve(5); Присоединение нескольких злементов sentence.push back("Hello."); sentence.push back("how") sentence.push back("are") sentence.push back("you") sentence.push back("?"): Вывод элементов, разделенных пробелами copy (sentence.beginO. sentence.endO. ostreani iterator<str1ng>(cout." ")); cout « endl; Вывод "служебных данных" cout « " niax s1ze(): " « sentence.niax s1zeO « endl cout « " sizeO: " « sentence.s1ze() « endl cout « " capacityO: " « sentence.capacityO « endl Перестановка второго и четвертого элемента swap (sentence[l]. sentence[3]); Вставка элемента "always" перед элементом "?" sentence, insert (find(sentence.beginO .sentence.endO."?") "always"): Присваивание "!" последнему элементу sentence.back О = "!"; Вывод элементов, разделенных пробелами сору (sentence.beginO . sentence.endO. ostreani iterator<string>(cout." ")): cout « endl: Повторный вывод "служебных данных" cout « " niax size(): " « sentence.nax size() « endl cout « " SizeO: " « sentence.SizeO « endl cout « " capacityO: " « sentence.capacity() « endl Результат выполнения программы выглядит примерно так: Hello, how are you? niax size(); 268435455 sizeO: 5 capacityO: 5 Hello, you are how always nax size(): 268435455 SizeO: 6 capacityO: 10 Обратите внимание на формулировку «примерно так». Значения max size() и capacityO зависят от реализации. Например, в данном случае видно, что если вектор не помещается в зарезервированной памяти, реализация удваивает его емкость. Класс vector<bool> Для векторов, содержащих элементы логического тина, в стандартной библиотеке С++ определена снециализиропанная разновидность класса vector. Это было сделано для того, чтобы оптимизированная версия занимала меньше места, чем стандартная реализация vector для тина bool. В стандартной реализации для каждого элемента резервируется минимум 1 байт. Во внутреннем представлении специализированной реализации vector<bool> каждый элемент обычно представляется одним битом, поэтому она занимает в восемь раз меньше памяти. Впрочем, оптимизация не дается даром: в С++ минимальное адресуемое .значение должно иметь размер минимум 1 байт. Следовательно, специализированная версия требует специальной обработки ссылок н итераторов. В результате vector<bool> не удовлетворяет всем требованиям других векторов (в частности, значение vector<bool>::reference не является полноценным 1-значепием, а итератор vector<bool>::iterator не является итератором произвольного доступа). Следовательно, код шаблона работает с векторами любого тигш, за исключением bool. Вдобавок класс vector<bool> может уступать обычным реализациям но скорости работы, потому что операции с элементами приходится преобразовывать в операции с битами. Впрочем, внутреннее устройство vector<bool> зависит от реализации, поэтому эффективность (как скорость работы, так и затраты памяти) может быть разной. Учтите, что класс vector<bool> представляет собой нечто большее, чем специализацию класса vectoro для bool. В него также включена поддержка специальных операций, упрощающих работу с флагами и наборами битов. Размер контейнера vector<bool> изменяется динамически, поэтому его можно рассматривать как битовое ноле с динамическим размером. Иначе говоря, вы можете добавлять и удалять биты. Если вы работаете с битовым нолем, имеющим статический размер, вместо класса vector<bool> лучше использовать bitset. Класс bitset рассматривается на с. 444. Дополнительные операции контейнера vector<bool> перечислены в табл. 6.8. Операция flip(), производящая логическую иьшерсию, может применяться как ко всем битам, так и к отдельному биту вектора. Таблица 6.8. Специальные операции vector<tx)o1> Операция Описание c.ftipO Инвертирует все логические элементы m[idx].flip() Инвертирует логический элемент с заданным индексом m[idx] = val Присваивает значение логическому элементу с индексом idx (присваивание одного бита) m[idxl] = m[idx2] Присваивает значение элемента с индексом idx2 элементу с индексом idxl 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 |