Операции над отображениями и мультиотображениями. Вставка и удаление элементов

   
На этом шаге мы рассмотрим особенности вставки элементов в отображения и мультиотображения.

   
В таблице 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 шаге; там же приведены примеры использования этой функции,
применимые и к отображениям. Стоит снова напомнить, что в отображениях предусмотрен более удобный способ вставки (и присваивания) элементов с помощью
оператора индексирования, который мы рассмотрим позднее.

   
На следующем шаге мы закончим изучение этого вопроса.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий