Анимация
JavaScript
|
Главная Библионтека Чтобы вместо обычного множества использовалось мультимножество, достаточно изменить тип контейнера (заголовочный файл остается тем же): typedef [nultiset<int> IntSet; Мультимножество допускает присутствие дубликатов, поэтому контейнер будет содержать два элемента со значением 1. Таким образом, выходные датнше программы будут выглядеть так: 1 1 2 3 4 5 6 Примеры использования отображений и мультиотображений Элементами отображений и мультиотображений являются пары «ключ/значение», поэтому синтаксис объявления, вставки и обращения к элементам несколько изменяется. Пример использования мультиотображения: stl/mmapl.cpp #inc1ude <iQstream> #include <map> #include <str1ng> using namespace std: int mainO Тип коллекции typedef mult1map<1nt,string> IntStnngMMap: IntStringMMap coll: Контейнер для хранения nap int/string Вставка элементов в произвольном порядке - эначение с ключом 1 вставляется дважды. г(5."tagged")); гС2."а")): r(l."this")): coll.insert(make pa coll.insert(make pa coll.insert(make pa col 1.insert(make pai rC4."of")); coll.insert(make pairC6."strings")); coll.insert(make pair(l,"is")): coll.insert(make pair(3."multimap")); /* Вывод содержимого контейнера * - перебор всех элементов * - переменная second содержит значение. */ IntStringMMap::iterator pos; for Cpos = coll.beginO; pos != coU.endO; ++pos) { cout « pQS->second « : cout « endl: Результат работы программы может выглядеть так: this is а multimap of tagged strings Однако из-за совпадения ключей «this»- и «is» эти слова также могут быть выведены в противоположном порядке. Сравнивая этот пример с приведенным на с. 99, можно заметить два основных различия. О Элементы представляют собой пары «ключ/значение», поэтому для вставки элемента в коллекцию необходимо создать объект pair. Задача решается с помощью вспомогательной функции make pair(). Донолнрттельная информация вместе с описанием других способов вставки приводится па с. 209. О Итератор ссылается на пару «ключ/значение», поэтому мы не можем просто направить его в выходной поток данных. Вместо этого приходится работать с отдельными членами структуры pair, которым присвоены имена first и second (тин pair представлен на с. 50). Следовательно, выражение pos->second определяет второй компонент пары «ключ/значение», то есть значение элемента мультиотображения. Как и в случае с обычными указателями, это выражение представляет собой сокрапгенную запись для (*pes).second. Аналогичное выражение pos->first определяет первый компонент нары «ключ/ значение»; в нашем примере это ключ элемента мультиотображения. Мультиотображения также могут использоваться в качестве словарей. Пример приведен на с. 215. Отображение как ассоциативный массив Если в предыдущем примере заменить multimap на тар, программа выведет те же данные без дубликатов (значения могут быть теми же). С другой стороны, набор пар «ключ/значение» с уникальными ключами также можно рассматривать как ассоциативный массив. Рассмотрим следующий пример: stl/mapl.cpp llnclude <1ostream> linclude <map> linclude <str1ng> using namespace std: int main() { /* Тип контейнера: * - map: элементами являются лары "ключ/значение" * - string: ключи относятся к типу string * - float: значения относятся к типу float */ typedef map<string.float> StrlngFloatMap; StringFloatMap coll: Вставка элементов в коллекцию CQll["VAT"] = 0.15; со11["Р1"] - 3.1415: со11["ап arbitrary number"] = 4983.223; coll["Null"] = 0: /* Вывод содержимого коллекции * - перебор всех элементов * - компонент first содержит ключ * - компонент second содержит эначение */ StringFloatMap::Iterator pos; for (pos = coll.beginO; pos != coll.endO; ++pos) { cout « "key: V" « pos->first « "\" " « "value: " « pos->second « endl; В объявлении типа контейнера должны быть указаны оба типа (ключа и значения): typedef map<string.float> StringFloatMap; При работе с отображениями операция вставки может осуществляться оператором индексирования []: coll["VAT"] = 0.15: coll["P-i"] = 3.1415; соП["ап arbitrary number"] = 4983.223; COll["Null"] = 0; Индекс используется в качестве ключа и может иметь произвольный тип. Такой интерфейс типичен для ассоциативных массивов. Ассоциативным массивом называется массив, индекс которого может относиться к произвольному типу (не обязательно числовому). Обратите внимание: оператор индексирования в данном случае работает не так, как обычный оператор индексирования массивов. Отсутствие элемента, связанного с индексом, не является ошибкой. При появлении нового индекса (или ключа) создается и вставляется в контейнер новый элемент, ключом которого является указанный индекс. Таким образом, в ассоциативных массивах индекс в принципе не может принимать недопустимое значение. Следовательно, в показанной ниже команде из рассмотренного примера создается новый элемент с ключом "NuH": C0ll["Nuir] = 0; Оператор присваивания связывает этот ключ со значением О, преобразованным к типу float. Использование отображений в качестве ассоциативных массивов более подробно рассматривается на с. 212. Оператор индексирования не может использоваться с мультиотображениями. Мультиотображение допускает наличие нескольких элементов с одинаковыми 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 |