На этом шаге мы рассмотрим особенности вставки элементов в отображения и мультиотображения.
В таблице 1 перечислены операции встапки и удаления элементов в отображениях и мультиотображениях.
Таблица 1. Операции вставки и удаления для отображений и мультиотображений
Операция | Описание |
---|---|
c.insert(elem) | Вставляет копию elem и возвращает позицию нового элемента; для отображений также возвращается признак успешного выполнения операции |
c.insert(pos,elem) | Вставляет копию elem и возвращает позицию нового элемента (pos определяет рекомендуемую позицию, с которой следует начинать поиск позиции вставляемого элемента) |
c.insert(beg,end) | Вставляет копию всех элементов интервала [beg,end) (и не возвращает значения) |
c.erase(elem) | Удаляет все элементы со значением elem и возвращает количество удаленных элементов |
c.erase(pos) | Удаляет элемент в позиции итератора pos (не возвращает значения) |
c.erase(beg,end) | Удаляет все элементы из интервала [beg,end) (не возвращает значения) |
c.clear() | Удаляет все элементы (контейнер остается пустым) |
Замечания на 164 шаге относительно операций вставки и удаления для множеств и мультимножеств справедливы и для отображений
с мультиотображениями. В частности, тип возвращаемого значения этих функций тоже зависит от типа контейнера. Но использование функций несколько усложняется
тем, что элемент представляет собой пару "ключ/значение".
При вставке пары "ключ/зиачеиие" необходимо учитывать, что внутри отображений и мультиотображений ключ считается константным. Вы должны либо предоставить
правильный тип, либо обеспечить явиое или неявное преобразование типа. Существуют три способа передачи значения при вставке нового элемента.
- Использование обозначения value_type. Для предотвращения неявного преобразования типа правильный тип указывается явно с использованием
обозначения value_type, предоставляемого контейнером в виде определения типа. Пример:std::map<std::string,float> coll; . . . . coll.insert(std::map<std::string,float>::value_type("otto",22.3));
- Использование типа pair<>. Другой способ основан на непосредственном использовании типа pair. Пример:
std::map<std::string,f1oat> coll; . . . . // С неявным преобразованием coll.insert(std::pair<std::string,float>("otto",22.3)); // С явный преобразованием coll.insert(std::pair<const std::string,float>("otto",22.3));
В первой команде insert() тип указан неточно, поэтому он приводится к реальному типу элементов. Для этого функция insert() должна быть определена
как шаблонная функция класса. - Использование функции make_pair(). Вероятно, самый удобный способ основан на использовании функции make_pair() (смотри 58 шаг).
Функция создает объект pair из двух компонентов, переданных в аргументах:std::map<std::string,float> coll; . . . . coll.insert(std::make_pair("otto",22.3));
В этом случае необходимые преобразования типа также выполняются шаблонной функцией insert().
В следующем простом примере вставки элемента в отображение мы также проверяем, успешно ли завершилась операция:
std::map<std::string,float> coll; . . . . if (coll.insert(std::make_pair("otto",22.3)),second) { std::cout << "Вставили otto/22.3" << std::endl; } else { std::cout << "Не удалось вставить otto/22.3 " << "(ключ otto уже есть)" << std::endl; }
Возвращаемые значения функции insert() описаны на 164 шаге; там же приведены примеры использования этой функции,
применимые и к отображениям. Стоит снова напомнить, что в отображениях предусмотрен более удобный способ вставки (и присваивания) элементов с помощью
оператора индексирования, который мы рассмотрим позднее.
На следующем шаге мы закончим изучение этого вопроса.