|
Программирование >> Операторы преобразования типа
(данная тема подробно обсуждается на с. 125). Элементы множеств и мультимножеств удаляются только функциями, предоставляемыми контейнером. Вставка и удаление элементов в табл. 6.25 перечислены операции вставки и удаления элементов в множествах и мультимножествах. Таблица 6.25. Операции вставки и удапения для множеств и мультимножеств Операция Описание c.insett(eiem) Вставляет копию elem и возвращает позицию нового элемента; для множеств также возвращается признак успешного выполнения операции c.insett(pos,eiem) Вставляет копию elem и возвращает позицию нового элемента (pos определяет рекомендуемую позицию, с которой следует начинать поиск позиции вставляемого элемента) c.insett(beg,end) Вставляет копию всех элементов интервала [beg,end) (и не возвращает значения) c.erase(elem) Удаляет все элементы со значением elem и возвращает количество удаленных элементов c.erase(pos) Удаляет элемент в позиции итератора pos (не возвращает значения) c.erase(beg,end) Удаляет все элементы из интервала [beg,end) (не возвращает значения) с.с1еаг() Удаляет все элементы (контейнер остается пустым) Как это обычно бывает при использовании STL, правильность аргументов обеспечивается вызывающей стороной. Итераторы должны ссылат1СЯ на правильные позиции, конец интервала не должен предшествовать началу, а элементы не должны удаляться из пустого контейнера. Вставка и удаление выполняются быстрее, если группа элементов обрабатывается одним вызовом вместо нескольких последовательных вызовов. Обратите внимание на тип возвращаемого значения функций вставки: О Интерфейс множеств: palr<1terator,bool> 1nsert(const value type& elem); iterator insert(iterator pos hint, const valut type& elem); О Интерфейс мультимножеств: iterator 1nsert(const value type& elem): iterator 1nsert(iterator pos hint, const valut type& elem): Различия в типах возвращаемых значений обусловлены тем, что дубликаты разрешены в мультимножествах, но запрещены в множествах. Следовательно, вставка элемента в множество может завершиться неудачей, если множество уже содержит элемент с таким же значением. Из-за этого возвращаемым значе- нием множества является значение типа pair (структура pair рассматривается на с. 50), то есть возвращаются два значения: О в поле second структуры pair возвращается признак успешного выполнения вставки; О в поле first структуры pair возвращается позиция вставленного или существующего элемента. Во всех остальных случаях функции возвращают позицию нового элемента (или существующего элемента, если множество уже содержит элемент с таким значением). Ниже приведен пример использования этого интерфейса при вставке. В множество с вставляется новый элемент со значением 3.3: std::set<double> с; 1f (с.1nsert(3.3).second) { std::cout 3.3 inserted std::endl; else { std::cout 3.3 already exists std::endl; Если программа должна дополнительно обработать новую или старую позицию элемента, программа усложняется: Определение переменной для возвращаемого значения InsertO std::pair<std:;set<float>;:Iterator.bool> status: Вставка элемента с присваиванием возвращаемого значения status = dnsertCvalue); Обработка возвращаемого значения if (status.second) { std::cout value inserted as element else { std::cout value already exists as element std::cout std; :d1stance(c.beginO.status.first) + 1 std::endl; Результат вызова первых двух функций в этом фрагменте может выглядеть так: 8,9 inserted as element 4 7.7 already exists as element 3 Обратите внимание: типы возвращаемых значений для функций вставки с дополнительным параметром позиции не зависят от типа контейнера. Эти функции возвращают один итератор как для множеств, так и для мультимножеств. Тем не менее вызов этих функций приводит к таким же результатам, как и вызов функции без параметра позиции. Они отличаются только по скорости работы. Функции можно передать позицию итератора, но эта позиция воспринимается только как рекомендация для оптимизации быстродействия. Если элемент вставляется сразу же за позицией, переданной в первом архументе, сложность операции изменяется от логарифмической до амортизированной постоянной (сложность операций рассматривается на с. 37). Тот факт, что тип возвращаемого значения функций вставки с дополнительным параметром позиции не зависит от типа контейнера, как в случае функций вставки без параметра, гарантирует, что функция вставки обладает одинаковым и}[терфейсом для всех типов контейнеров. Этот интерфейс используется несколькими общими итераторами вставки (за подробностями обращайтесь на с. 279). Чтобы удалить элемент с некоторым значением, достаточно вызвать функцию erase(): std::set<Elem> coll: Удаление всех элементов с переданным значением coll.eraseCvalue); В отличие от списков функция удаления для множеств и мультимножеств называется erase(), а не remove() (см. описание функции remove() на с. 179). Она ведет себя иначе и возвращает количество удаленных элементов. Для множеств возвращаются только значения Он 1. Если мультимножество содержит дубликаты, вам не удастся использовать функцию eraseO для удаления только первого дубликата. Вместо этого можно воспользоваться следующим фрагментом: std::mult1set<Elem> coll; Удаление первого элемента с переданным значением std:;multlset<Elem>::iterator pos: pos = coll.find (elem); if (pos != coll .endO) { coll.erase(pos): Вместо алгоритма find() следует использовать функцию класса find(), потому что она работает быстрее (см. пример на с. 163). Обратите внимание: в данном случае также существуют различия в типе возвращаемого значения, а именно: для последовательных и ассоциативных контейнеров функция erase() возвращает разные типы. О Последовательные контейнеры поддерживают следующие функции erase(): iterator erase(iterator pos); iterator erasedterator beg, Iterator end); О Ассоциативные контейнеры поддерживают следующие функции erase(): void erasedterator pos); void erasedterator beg. iterator end);
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |