Анимация
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

В системах, не поддерживающих значения по умолча1Н1Ю для параметров шаблонов, критерий сортировки обычно является обязательным параметром:

set<1nt.less<1nt> > coll;

ров с одним критерием сортировки. Этот способ определения критерия сортировки является наиболее распространенным. Выражаясь точнее, в третьем параметре передается тип критерия сортировки, а конкретный критерий - это объект функции, создаваемый в контейнере. Для этого конструктор контейнера вызывает конструктор по умолчанию типа критерия сортировки. Пример с определением пользовательского критерия сортировки приведен на с. 296.

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

Если критерий сортировки не указан, по умолчанию используется объект функции lesso, сортирующий элементы оператором <.

Полное имя типа для контейнера получается излишне слож1П>1м и громоздким, поэтому для него рекомендуется определить псевдоним (то же самое полезно сделать и для определений итераторов):

typedef std::map<std::str1ng.float.std::greater<strlng> > StringFloatMap:

StringFloatMap coll:

Конструктор, которому передается начало и конец интервала, может применяться для инициа./шзации контейнера элементами контейнеров, относящихся к другим тинам (от массива до стандартного входного потока данных). За подробностями обращайтесь к с. 153. Однако в данном случае элементы представляют собой пары «ключ/значение», поэтому необходимо проследить за тем. чтобы элементы исходного интервала относились к типу ра\г<ключ,зпачение> или могли быть преобразованы к нему.

Немодифицирующие операции над отображениями и мультиотображениями

Отображения и мультиотображенпя поддерживают обычный набор операций для получения размера контейнера и сравнения элементов (табл. 6.27).

Таблица 6.27. Немодифицирующие операции над отображениями и мультиотображениями Операция Описание

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

c.emptyO Проверяет, пуст ли контейнер (эквивалент sizeO==0, но иногда

выполняется быстрее)



Операция

Описание

c.max sizeC) cl == с2 cl! = с2 cl < с2 с1>с2 с1 < с2 с1 >= с2

Возвращает максимально возможное количество элементов Проверяет равенство с1 и с2

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

Операции сравнения определены только для однотипных контейнеров. Это означает совпадение ключа, значепш и критерия сортировки; в противном случае происходит ошибка компиляции. Пример:

std::fnap<float.std::string> cl: Критерий сортировки: less<> std;:rnap<float.std::string.std;:greater<float> > c2;

if (cl == c2) {

ОШИБКА: разные типы

Отношение «меньше/бо.яьшс» между контейнерами проверяется по лексикографическому критерию (см. с. 356). Для сравнения контейнеров разных типов (с разными критериями сортировки) необходимо использовать алгоритмы, описанные на с. 352.

Специальные операции поиска

По аналогии с множествами и мультимножествами в отображениях и муль-тиотображениях определены специальные функции поиска, оптимизированные с учетом внутренней древовидной структуры контейнера (табл. 6.28).

Таблица 6.28. Специальные операции поиска в отображениях и мультиотображениях

Операция

Описание

count(key) find (key)

lower bound(key) upper bound(key) equal range(key)

Возвращает количество элементов с ключом key

Возвращает позицию первого элемента с ключом key (или end())

Возвращает первую позицию, в которой может быть вставлен элемент с ключом key (первый элемент с ключом >= key)

Возвращает последнюю позицию, в которой может быть вставлен элемент с ключом key (первый элемент с ключом > key)

Возвращает первую и последнюю позиции, в которых может быть вставлен элемент с ключом key (интервал, в котором ключи равны key)

Функция findO ищет первый элемент с заданным ключом и возвращает его позицию в виде итератора. Если поиск оказывается безуспешным, функция



find() возвращает end(). Функция find() не может использоваться для поиска элемента с заданным значением. Вместо этого приходится задействовать универсальный алгоритм типа find if() или программировать цикл. Ниже приведен пример простого цикла, выполняющего некоторую операцию для каждого элемента с заданным значением:

std::mu]timap<std::string.float> coll;

Выполнение операции над всеми элементами с заданным значением std: :rnult1rnap<std::string.float>::iterator pos: for (pos *= coll.beginO: pos != coll.endO: ++pos) { 1f (pos->second == value) { do someth1ng();

Если цикл используется для удаления элементов, будьте осторожны - по ошибке можно «отпилить ветку, на которой сидишь». За подробностями обращайтесь на с. 211.

Искать элемент с заданным значением при помощи алгоритма find if() еще сложнее, чем запрограммировать цикл, поскольку для этого придется создать объект функции, сравнивающий значение элемента с заданным значением. Пример приведен на с. 217.

Функции lovifer bound(), upper bound() и equaLrange() работают так же, как во множествах (см. с. 188), за исключением того, что позиция определяется по ключу.

Присваивание

В отображениях и мультиотображениях определены только базовые операции присваивания, поддерживаемые всеми контейнерами (табл, 6.29). Дополнительная информация приведена на с. 156.

Таблица 6.29. Операции присваивания для отображений и мультиотображений Операция Описание

с1 = с2 Присваивает с1 все элементы с2

cLswap(c2) Меняет местами содержимое с1 и с2

swap(cl,c2) То же, но в форме глобальной функции

Для выполнения операций присваивания контейнеры должны относиться к одному типу. В частности, должны совпадать типы критериев сравнения, хотя сами критерии могут различаться. Пример использования разных критериев сортировки, относящихся к одному типу, приведен на с. 198. Если критерии различаются, в результате присваивания или перестановки они также меняются местами.

Функции получения итераторов

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



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