Freigeben über


set::insert

Fügt ein Element oder einen Elementbereich in einen Satz ein.

// (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 ); 

Parameter

Parameter

Beschreibung

Val

Der Wert eines in den Satz einzufügenden Elements, es sei denn, es ist bereits ein Element enthalten, dessen Wert gleichwertig sortiert wird.

Where

Die Position, an dem mit der Suche nach dem richtigen Einfügepunkt begonnen wird. (Wenn dieser Punkt Where direkt vorausgeht, kann die Einfügung in amortisierter konstanter Zeit anstelle von logarithmischer Zeit eintreten.)

ValTy

Der Vorlagenparameter, mit dem der Argumenttyp angegeben wird, der vom Satz verwendet werden kann, um ein Element von value_type zu erstellen und Val perfekt als Argument weiterzuleiten.

First

Die Position des ersten zu kopierenden Elements.

Last

Die Position direkt über den letzten zu kopierenden Elements.

InputIterator

Das Vorlagenfunktionsargument, das den Anforderungen eines Eingabeiterators erfüllt, der auf Elemente eines Typs zeigt, der zum Erstellen von value_type-Objekten verwendet werden kann.

IList

Das initializer_list-Element, aus dem die Elemente kopiert werden sollen.

Rückgabewert

Die Einzelelement-Memberfunktionen (1) und (2) geben ein Paar zurück, dessen bool-Komponente "true" lautet, wenn eine Einfügung durchgeführt wurde, und "false", wenn im Satz bereits ein Element enthalten ist, dessen Schlüssel einen entsprechenden Wert in der Reihenfolge aufweist. Die Iteratorkomponente des Rückgabewertpaars zeigt auf das neu eingefügten Element, wenn die bool-Komponente "true" lautet, oder auf das vorhandene Element, wenn die bool-Komponente "false" lautet.

Die Einzelelement-Memberfunktionen mit Hinweis (3) und (4) geben einen Iterator zurück, der auf die Position zeigt, an der das neue Element in den Satz eingefügt wurde, oder, falls ein Element mit einem entsprechenden Schlüssel bereits vorhanden ist, auf das vorhandene Element.

Hinweise

Durch diese Funktion werden keine Iteratoren, Zeiger oder Verweise ungültig.

Wird beim Einfügen von nur einem Element eine Ausnahme ausgelöst, wird der Zustand des Containers nicht geändert. Wird beim Einfügen mehrerer Elementen eine Ausnahme ausgelöst, wird der Container in einem nicht angegebenen doch gültigen Zustand belassen.

Um auf die Iteratorkomponente eines pair pr-Elements zuzugreifen, das von den Einzelelement-Memberfunktionen zurückgegeben wird, wird pr.first verwendet. Um den Iterator im zurückgegebenen Paar zu dereferenzieren, verwenden Sie *pr.first. Damit erhalten Sie ein Element. Um auf die bool-Komponente zuzugreifen, verwenden Sie pr.second. Eine Beispiel finden Sie unter Beispielcode weiter unten in diesem Artikel.

Das value_type-Element eines Containers ist eine Typedef, die dem Container angehört, und beim Satz ist set<V>::value_type vom Typ const V.

Die Bereichsmemberfunktion (5) fügt die Sequenz von Elementwerten in einen Satz ein, das jedem Element entspricht, das von einem Iterator im Bereich [First, Last) adressiert wird. Daher wird Last nicht eingefügt. Die Containermemberfunktion end() bezieht sich auf die Position direkt hinter dem letzten Element im Container. Z. B versucht die Anweisung s.insert(v.begin(), v.end()); alle Elemente von v in s einzufügen. Nur Elemente, die eindeutige Werte im Bereich aufweisen werden eingefügt. Duplikate werden ignoriert. Um zu betrachten welche Elemente abgelehnt werden, verwenden Sie die Einzelelementversionen von insert.

Die Memberfunktion für die Initialisiererliste (6) verwendet eine initializer_list, um Elemente in den Satz zu kopieren.

Für das Einfügen eines vor Ort erstellten Elements. Das heißt, es wurden keine Kopie- oder Verschiebevorgänge ausgeführt. Informationen unter set::emplace und set::emplace_hint.

Beispiel

// 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;
}

Ausgabe

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)

Anforderungen

Header: <set>

Namespace: std

Siehe auch

Referenz

<set>

set-Klasse

multiset::insert

Standardvorlagenbibliothek