Программирование >>  Операторы преобразования типа 

1 ... 62 63 64 [ 65 ] 66 67 68 ... 239


pos = coll.eraseCpos): Хорошо бы. но...

} происходит ОШИБКА КОМПИЛЯЦИИ!

else {

++pos:

Проектировщики решили не возвращать следующее значение, потому что если эта возможность ие используется в программе, она просто означает лишние затраты времени. Автор не согласен с подобным решением, поскольку оно способствует появлению ошибок и усложнению программ (а в конечном счете может обернуться еще большими затратами времени).

Правильный способ удаления элемента, на который ссылается итератор, выглядит так:

typedef std::[nultimap<std::string.float> StringFloatMap; StringFloatMap coll: StringFloatMap::iterator pos;

Удаление всех элементов с заданным значением for (pos = coll,beginO; pos != coll.endO: ) { 1f Cpos->second == value) { coll ,erase(pos++):

else {

++pOS;

Постфиксная команда pos+-i- переводит итератор pos к следующему элементу, но возвращает копию исходного значегптя. Следовательно, в момент вызова erase() итератор pos не ссылается на удаляемый элемент.

Отображения как ассоциативные массивы

Ассоциативные контейнеры обычно ие предоставляют прямого доступа к своим элементам; все обращения к элементам производятся через итераторы. Впрочем, отображения являются исключением из этого правила. Неконстантные отображения поддерживают оператор индексирования [] для прямого доступа к элементам (табл. 6.32). Тем не менее в качестве индекса используется не целочисленная позиция элемента, а ключ, предназначенный для его ндеитификацпи. Это означает, что индекс может относиться к произвольному типу. Подобный интерфейс характерен для так называемых ассоциативных массивов.

Таблица 6.32. Прямой доступ к элементам отображения оператором [] Операция Описание

т[кеу] Возвращает ссылку на значение элемента с ключом key. Вставляет

элемент с ключом key, если его не существует



Ассоциативные массивы отличаются от обычных не только типом индекса. Индекс ассоциативного массива в принципе не может быть неправильным. Если элемента с заданным ключом не существует, в отображение автоматически вставляется новый элемент, значение которого инициализируется конструктором по умолчанию соответствующего типа. Чтобы эта схема работала, тип значения обязательно должен иметь конструктор по умолчанию. Базовые типы данных предоставляют конструктор по умолчанию, который инициализирует их значения нулями (см. с. 30).

У ассощтатнвных массивов есть как свои достоинства, так и недостатки.

О Основное достоинство - возможность использования более удобного интерфейса при вставке новых элементов в отображение. Пример:

std: :rnap<std:: string. float> coll: Пустая коллекция

/* Вставка пары otto /7.7

* - сначала вставляется пара ottoVfloatO

* - затем присваивается 7,7 */

coll[ otto ] = 7.7:

Обратите внимание на следующую команду: coll[ otto ] = 7.7:

Она работает следующим образом.

1) Обработка выражения coll[ otto ].

Если элемент с ключом otto существует, выражение возвращает значение элемента по ссылке. Если элемента с ключом otto не существует (как в нашем примере), в контейнер автоматически вставляется новый элемент с ключом otto , причем значение элемента определяется конструктором по умолчанию для типа значения, и далее возвращается ссылка на значение нового элемента.

2) Присваивание числа 7.7 значению нового или существующего элемента.

В результате в отображении появляется элемент с ключом otto и значением 7.7.

О К недостаткам ассоциативных массивов относится возможность непреднамеренной вставки элементов. Скорее всего, результат выполнения следующей команды окажется неожиданным для программиста:

std::cout coll[ ottto ]

Команда вставляет в контейнер новый элемент с ключом ottto и выводит его значение, по умолчанию равное 0. На самом деле следовало бы вывести сообщение об ошибке с указанием на неверное написание otto .

Также следует учитывать, что этот способ вставки медленнее обычного, описанного на с. 209. Дело в том, что новое значение сначала инициализируется значением по умолчанию для своего типа, которое затем заменяется правильным значением.



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

в отношении исключений отображения и мультиотображения предоставляют такие же гарантии, как множества и мультимножества (см. с. 194).

Примеры использования отображений и мультиотображений

Отображение как ассоциативный массив

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

cont/mapl.cpp #include <1o5tream> Iinclude <map> #include <string> using namespace std:

int mainO

/* Создание отображения / ассоциативного массива

* - ключи - тип string

* - значения - тип float */

typedef mdp<string.float> StringFloatMap:

StringFloatMap stocks; Создание пустого контейнера

Вставка нескольких элементов stocks[ BASF ] = 369.50; stocks[ VW] = 413.50: stocks[ Dairiiler ] = 819,00; StOCks[ BMW] = B34.00; stocks[ S1emens ] = 842.20:

Вывод всех элементов StringFloatMap::iterator pos;

for (pos = stocks.beginO; pos != stocks.endO: ++pos) { cout stock; pos->first \t price: pos->second endl:

cout endl:

Биржевой бум (все цены удваиваются) for (pos = stocks.beginO: pos != stocks.endO; ++pos) { pos->second *= 2;



1 ... 62 63 64 [ 65 ] 66 67 68 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика