На этом шаге мы рассмотрим особенности вставки элементов в отображения и мультиотображения.
В таблице 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 шаге относительно операций вставки и удаления для множеств и мультимножеств справедливы и для отображений с мультиотображениями. В частности, тип возвращаемого значения этих функций тоже зависит от типа контейнера. Но использование функций несколько усложняется тем, что элемент представляет собой пару "ключ/значение".
При вставке пары "ключ/зиачеиие" необходимо учитывать, что внутри отображений и мультиотображений ключ считается константным. Вы должны либо предоставить правильный тип, либо обеспечить явиое или неявное преобразование типа. Существуют три способа передачи значения при вставке нового элемента.
std::map<std::string,float> coll; . . . . coll.insert(std::map<std::string,float>::value_type("otto",22.3));
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() должна быть определена как шаблонная функция класса.
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 шаге; там же приведены примеры использования этой функции, применимые и к отображениям. Стоит снова напомнить, что в отображениях предусмотрен более удобный способ вставки (и присваивания) элементов с помощью оператора индексирования, который мы рассмотрим позднее.
На следующем шаге мы закончим изучение этого вопроса.