Поделиться через


set::insert

Вставляет элемент или диапазон элементов в набор.

// (1) single element pair<iterator, bool> insert(     const value_type& Val );   // (2) single element, perfect forwarded template<class ValTy> pair<iterator, bool> insert(     ValTy&& Val );  // (3) single element with hint iterator insert(     const_iterator Where,     const value_type& Val );   // (4) single element, perfect forwarded, with hint template<class ValTy> iterator insert(     const_iterator Where,     ValTy&& Val );  // (5) range  template<class InputIterator>  void insert(     InputIterator First,     InputIterator Last );   // (6) initializer list void insert(     initializer_list<value_type> IList ); 

Параметры

Параметр

Описание

Val

Значение элемента, вставляемого в набор, если оно уже не содержит элемент, значение которого эквивалентно упорядочено.

Where

Место начала поиска правильной точки вставки. (Если эта точка находится непосредственно перед Where, вставка может быть выполнена в постоянном времени с поправкой на амортизацию, а не в логарифмическом времени.)

ValTy

Параметр шаблона, определяющий тип аргумента, с помощью которого набор формирует элемент типа value_type и точно пересылает Val как аргумент.

First

Позиция первого элемента, который следует скопировать.

Last

Позиция непосредственно перед последним элементом, который следует скопировать.

InputIterator

Аргумент функции-шаблона, который соответствует требованиям итератора ввода, указывающего на элементы типа, которые можно использовать для создания объектов value_type.

IList

Объект initializer_list, из которого копируются элементы.

Возвращаемое значение

Одноэлементные функции члены (1) и (2) возвращают пару, компонент bool которой имеет значение true, если была осуществлена вставка, и значение false, если набор уже содержал элемент с эквивалентным порядковым значением. Компонент итератора пары возвращаемых значений указывает на вставленный элемент, если значение компонента bool равно true, или на существующий элемент, если значение компонента bool равно false.

Одноэлеметные функции-члены с подсказкой (3) и (4) возвращают итератор, который указывает на позицию, где новый элемент был вставлен, или, если элемент с эквивалентным ключом уже существует, указывает на существующий элемент.

Заметки

Эта функция не делает никакие итераторы, указатели или ссылки недействительными.

Если во время вставки одного элемента вызывается исключение, состояние контейнера не изменяется. Если во время вставки нескольких элементов вызывается исключение, контейнер остается в неопределенном, но допустимом состоянии.

Для доступа к компоненту итератора pair pr, возвращаемого одноэлементными функциями-членами, используйте pr.first. Для разыменования итератора в возвращенной паре используйте *pr.first, чтобы получить элемент. Для доступа к компоненту bool используйте pr.second. См. пример кода далее в этой статье.

value_type контейнера — это определение типа, которое принадлежит контейнеру, а для набора set<V>::value_type — это const V.

Функция-член с диапазоном (5) вставляет последовательность значений элементов в набор, соответствующий каждому элементу, адресованному итератором в диапазоне [First, Last). Следовательно, Last не вставляется. Контейнер функции-члена end() ссылается на позицию сразу после последнего элемента в контейнере. Например, оператор s.insert(v.begin(), v.end()); пытается вставить все элементы v в s. Вставляются только элементы с уникальными значениями в диапазоне. Повторяющиеся значения игнорируются. Чтобы увидеть, какие элементы отклонены, используйте одноэлементные версии insert.

Функция-член списка инициализаторов (6) использует initializer_list для копирования элементов в набор.

Сведения о вставке элемента, созданного на месте (т. е. без выполнения операций копирования или перемещения), см. в описании функций set::emplace и set::emplace_hint.

Пример

// set_insert.cpp
// compile with: /EHsc
#include <set>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

template <typename S> void print(const S& s) {
    cout << s.size() << " elements: ";

    for (const auto& p : s) {
        cout << "(" << p << ") ";
    }

    cout << endl;
}

int main()
{

    // insert single values 
    set<int> s1;
    // call insert(const value_type&) version
    s1.insert({ 1, 10 });
    // call insert(ValTy&&) version 
    s1.insert(20);

    cout << "The original set values of s1 are:" << endl;
    print(s1);

    // intentionally attempt a duplicate, single element
    auto ret = s1.insert(1);
    if (!ret.second){
        auto elem = *ret.first;
        cout << "Insert failed, element with value 1 already exists."
            << endl << "  The existing element is (" << elem << ")"
            << endl;
    }
    else{
        cout << "The modified set values of s1 are:" << endl;
        print(s1);
    }
    cout << endl;

    // single element, with hint
    s1.insert(s1.end(), 30);
    cout << "The modified set values of s1 are:" << endl;
    print(s1);
    cout << endl;


    // The templatized version inserting a jumbled range
    set<int> s2;
    vector<int> v;
    v.push_back(43);
    v.push_back(294);
    v.push_back(41);
    v.push_back(330);
    v.push_back(42);
    v.push_back(45);

    cout << "Inserting the following vector data into s2:" << endl;
    print(v);

    s2.insert(v.begin(), v.end());

    cout << "The modified set values of s2 are:" << endl;
    print(s2);
    cout << endl;

    // The templatized versions move-constructing elements
    set<string>  s3;
    string str1("blue"), str2("green");

    // single element
    s3.insert(move(str1));
    cout << "After the first move insertion, s3 contains:" << endl;
    print(s3);

    // single element with hint
    s3.insert(s3.end(), move(str2));
    cout << "After the second move insertion, s3 contains:" << endl;
    print(s3);
    cout << endl;

    set<int> s4;
    // Insert the elements from an initializer_list
    s4.insert({ 4, 44, 2, 22, 3, 33, 1, 11, 5, 55 });
    cout << "After initializer_list insertion, s4 contains:" << endl;
    print(s4);
    cout << endl;
}

Вывод

The original set values of s1 are:
3 elements: (1) (10) (20)
Insert failed, element with value 1 already exists.
  The existing element is (1)

The modified set values of s1 are:
4 elements: (1) (10) (20) (30)

Inserting the following vector data into s2:
6 elements: (43) (294) (41) (330) (42) (45)
The modified set values of s2 are:
6 elements: (41) (42) (43) (45) (294) (330)

After the first move insertion, s3 contains:
1 elements: (blue)
After the second move insertion, s3 contains:
2 elements: (blue) (green)

After initializer_list insertion, s4 contains:
10 elements: (1) (2) (3) (4) (5) (11) (22) (33) (44) (55)

Требования

Заголовок: <set>

Пространство имен: std

См. также

Ссылки

<set>

Класс set

multiset::insert

Библиотека стандартных шаблонов