|
Программирование >> Операторы преобразования типа
Удаление старого элемента coll .eraseC olcl key ); Использование оператора индексирования с отображениями рассматривается па с. 212. Вставка и удаление элементов в табл. 6.31 перечислены операции вставки и удаления элементов в отображениях и мультиотображениях. Таблица 6.31. Операции вставки и удаления для отображений и мультиотображений Операция Описание c.lnsertCelem) Вставляет копию elem и возвращает позицию нового элемента; для отображений также возвращается признак успешного выполнения операции c.insertCpos.elem) Вставляет копию elem и возвращает позицию нового элемента (pos определяет рекомендуемую позицию, с которой следует начинать поиск позиции вставляемого элемента) c.insertCbeg,end) Вставляет копию всех элементов интервала [beg,end) (и не возвращает значения) c.erase(elem) Удаляет все элементы со значением elem и возвращает количество удаленных элементов c.erase(pos) Удаляет элемент в позиции итератора pos (не возвращает значения) c.erase(beg,end) Удаляет все элементы из интервала [beg,end) (не возвращает значения) c.clearO Удаляет все элементы (контейнер оаается пустым) Замечания на с, 191 относительно операций вставки и удаления для множеств и мультимножеств справедливы и для отображений с мультиотображениями. В частности, тип возвращаемого значения этих функций тоже зависит от тина контейнера. Но использование функций несколько усложняется тем, что элемент представляет собой пару ключ/значение . При вставке пары ключ/зиачеиие необходимо учитывать, что внутри отображений и мультиотображений ключ считается константным. Вы должны либо предоставить правильный тип, либо обеспечить явное или неявное преобразование тина. Существуют три способа передачи значения при вставке нового элемента. О Использование обозначения valuejtype. Для предотвращения неявного преобразования типа правильный тип указывается явно с использованием обозначения value type, предоставляемого контейнером в виде определения типа. Пример: std::map<std::str1ng,float> coll: coll.1nsert(std::map<std::str1ng,float>::value type( otto . 22,3)): Если ваша система не поддерживает шаблонные функции классов, передайте элемент с правильным типом. Обычно для этого необходимо произвести яв1юс преобразование типа. О Использование типа pair<>. Другой способ основан на непосредственном использовании типа pair. Пример: std::rnap<std:: string. f 1 oat> col 1: С неявным преобразованием coll.insert сstd:;pa1r<std::string.flDat>( otto .22.3)); С явным преобразованием coll-insert(std::pair<const std::String.float>( otto .22.3)): В первой команде insertO тин указан неточно, поэтому он приводится к реальному типу элементов. Для этого функция insert() должна быть определена как шаблонная функция класса. О Использование функции makejpairQ. Вероятно, самый удобный способ основан на использовании функции make pair() (см. с. 53). Функция создает объект pair из двух компонентов, переданных в аргументах: std::map<std::strlng.float> coll: coll .1nsert(std: :rnake pa1 r( otto .22.3)): В этом случае необходимые преобразования типа также выполняются шаблонной функцией insert(). В следующем простом примере вставки элемента в отображение мы также проверяем, успешно ли завершилась операция: std::map<std::string.float> coll: if (coll.insert(std::make pair( otto .22,3)).second) { std::cout OK. could insert otto/22.3 std::endl: else { std::cout Oops, could not insert otto/22.3 (key otto already exists std:;endl: Возвращаемые значения функции insert() описаны на с. 191; там же приведены примеры использования этой функции, применимые и к отображениям. Стоит снова напомнить, что в отображениях предусмотрен более удобньпг способ вставки (и присваивания) элементов с помощью оператора индексирования (см. с. 212). Чтобы удалить элемент с известным ключом, достаточно вызвать функцию erase(); std:: rnap<std:: stri ng. f 1 oat> col 1: Удаление всех элементов с заданным ключом coll.erase(key): Эта версия erase() возвращает количество удаленных элементов. Для отображений возвращается либо О, либо 1. Если мультиотображение содержит дубликаты, вам не удастся использовать функцию eraseO Для удаления только первого дубликата. Вместо этого можно воспользоваться следующим фрагментом: typedef std: :mLilt1rnap<5td; :5tring,float> StringFloatMMap: StrlngFloatMMap coll; Удаление первого элемента с переданным ключом StringFloatMMap:iterator pos; pos = col 1.f1nd(key): if (pos != coll.endO) { coll.erase(pos): Вместо алгоритма find() используется функция класса find(), потому что она работает быстрее (см. пример на с. 163). Функция find() не годится для удаления элементов по известному значению (вместо ключа). Эта тема подробно обсуждается на с. 205. При удалении элементов необходима осторожность, иначе вы рискуете отпилить ветку, на которой сидите , то есть удалить элемент, на который ссылается итератор. Пример: typedef std; :rnultirnap<std::string,float> StringFloatMap: StringFloatMap coll: StringFloatMap::iterator pos: for (pos = coll.beginO: pos != coll.endO; ++pos) { if (pos->second == value) { coll.erase(pos); ОШИБКА ВРЕМЕНИ ВЫПОЛНЕНИЯ!!! После вызова erase() для элемента, на который ссылается итератор pos, итератор становится недействительным. Любые попытки использования pos после удаления элемента без повторной инициализации - даже команда +-i-pos - приводят к непредсказуемым последствиям. Если бы функция eraseO всегда возвращала значение следующего элемента, проблема решалась бы просто: typedef std::[nultimap<std::str1ng.float> StringFloatMap: StringFloatMap coll: StringFloatMap::iterator pos: for (pos = coll.beginO: pos != coll.endO: ) ( if (pos->second == value) {
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |