Namensräume
Varianten
Aktionen

std::deque<T,Allocator>::insert

Von cppreference.com
< cpp‎ | container‎ | deque
 
 
 
 
iterator insert( const_iterator pos, const T& value );
(1)
iterator insert( const_iterator pos, T&& value );
(2) (seit C++11)
iterator insert( const_iterator pos,
                 size_type count, const T& value );
(3)
template< class InputIt >
iterator insert( const_iterator pos, InputIt first, InputIt last );
(4)
iterator insert( const_iterator pos, std::initializer_list<T> ilist );
(5) (seit C++11)

Fügt Elemente an der angegebenen Position in den Container ein.

1) Fügt eine Kopie von value vor pos ein.
2) Fügt value vor pos ein, möglicherweise unter Verwendung von Move-Semantik.
3) Fügt count Kopien von value vor pos ein.
4) Fügt Elemente aus dem Bereich [firstlast) vor pos ein.

Diese Überladung hat denselben Effekt wie Überladung (3), wenn InputIt ein integraler Typ ist.

(bis C++11)

Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn InputIt LegacyInputIterator erfüllt, um Mehrdeutigkeiten mit Überladung (3) zu vermeiden.

(seit C++11)
Wenn first und last Iteratoren in *this sind, ist das Verhalten undefiniert.
5) Fügt Elemente aus der Initialisierungsliste ilist vor pos ein.

Alle Iteratoren (einschließlich des end()-Iterators) werden ungültig. Referenzen werden ebenfalls ungültig, es sei denn, pos == begin() oder pos == end(), in diesem Fall werden sie nicht ungültig.

Inhalt

[editieren] Parameter

pos - Iterator, vor dem der Inhalt eingefügt werden soll (pos kann der end()-Iterator sein)
value - Elementwert, der eingefügt werden soll
zählt - Anzahl der einzufügenden Elemente
first, last - Das Iteratorenpaar, das den einzufügenden Elementbereich definiert (cannot be iterators into container for which insert is called)
ilist - std::initializer_list, aus dem die Werte eingefügt werden sollen
Typanforderungen
-
T muss die Anforderungen von CopyAssignable und CopyInsertable erfüllen, um Überladung (1) verwenden zu können.
-
T muss die Anforderungen von MoveAssignable und MoveInsertable erfüllen, um Überladung (2) verwenden zu können.
-
T muss die Anforderungen von CopyAssignable und CopyInsertable erfüllen, um Überladung (3) zu verwenden.
-
T muss die Anforderungen von EmplaceConstructible erfüllen, um die Überladungen (4,5) zu verwenden.
-
T muss die Anforderungen von Swappable, MoveAssignable, MoveConstructible und MoveInsertable erfüllen, um die Überladungen (4,5) verwenden zu können. (seit C++17)

[editieren] Rückgabewert

1,2) Iterator, der auf den eingefügten value zeigt.
3) Iterator, der auf das erste eingefügte Element zeigt, oder pos, wenn count == 0.
4) Iterator, der auf das erste eingefügte Element zeigt, oder pos, wenn first == last.
5) Iterator, der auf das erste eingefügte Element zeigt, oder pos, wenn ilist leer ist.

[editieren] Komplexität

1,2) Konstante plus linear in der kleineren der Distanzen zwischen pos und einem der Enden des Containers.
3) Linear in count plus linear in der kleineren der Distanzen zwischen pos und einem der Enden des Containers.
4) Linear in std::distance(first, last) plus linear in der kleineren der Distanzen zwischen pos und einem der Enden des Containers.
5) Linear in ilist.size() plus linear in der kleineren der Distanzen zwischen pos und einem der Enden des Containers.

[editieren] Ausnahmen

Wenn eine Ausnahme geworfen wird, außer durch

  • den Kopierkonstruktor von T,
  • den Verschiebekonstruktor von T,
(seit C++11)
  • den Kopierzuweisungsoperator von T,
  • den Verschiebezugewiesungsoperator von T,
(seit C++11)

hat diese Funktion keine Auswirkung (starke Ausnahmegarantie).

Wenn beim Einfügen eines einzelnen Elements an einem der Enden eine Ausnahme geworfen wird, hat diese Funktion keine Auswirkung (starke Ausnahmegarantie). Andernfalls, wenn eine Ausnahme durch den Verschiebekonstruktor eines nicht CopyInsertable T geworfen wird, sind die Auswirkungen nicht spezifiziert.

(seit C++11)

Beispiel

#include <iostream>
#include <iterator>
#include <string_view>
#include <deque>
 
namespace stq {
void println(std::string_view rem, const std::deque<int>& container)
{
    std::cout << rem.substr(0, rem.size() - 2) << '[';
    bool first{true};
    for (const int x : container)
        std::cout << (first ? first = false, "" : ", ") << x;
    std::cout << "]\n";
}
}
 
int main()
{
    std::deque<int> c1(3, 100);
    stq::println("1. {}", c1);
 
    auto pos = c1.begin();
    pos = c1.insert(pos, 200); // overload (1)
    stq::println("2. {}", c1);
 
    c1.insert(pos, 2, 300); // overload (3)
    stq::println("3. {}", c1);
 
    // reset pos to the begin:
    pos = c1.begin();
 
    std::deque<int> c2(2, 400);
    c1.insert(std::next(pos, 2), c2.begin(), c2.end()); // overload (4)
    stq::println("4. {}", c1);
 
    int arr[] = {501, 502, 503};
    c1.insert(c1.begin(), arr, arr + std::size(arr)); // overload (4)
    stq::println("5. {}", c1);
 
    c1.insert(c1.end(), {601, 602, 603}); // overload (5)
    stq::println("6. {}", c1);
}

Ausgabe

1. [100, 100, 100]
2. [200, 100, 100, 100]
3. [300, 300, 200, 100, 100, 100]
4. [300, 300, 400, 400, 200, 100, 100, 100]
5. [501, 502, 503, 300, 300, 400, 400, 200, 100, 100, 100]
6. [501, 502, 503, 300, 300, 400, 400, 200, 100, 100, 100, 601, 602, 603]

[editieren] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 149 C++98 Überladungen (3) und (4) gaben nichts zurück Gibt einen Iterator zurück.
LWG 247 C++98 die Komplexität war nur spezifiziert
für das Einfügen eines einzelnen Elements
auch für das Einfügen spezifiziert
mehrerer Elemente

[editieren] Siehe auch

(C++11)
konstruiert Elemente direkt (in-place)
(public member function) [edit]
fügt ein Element am Anfang ein
(public member function) [edit]
fügt ein Element am Ende hinzu
(public member function) [edit]
erstellt einen std::insert_iterator vom Typ, der aus dem Argument abgeleitet wird
(Funktionsvorlage) [bearbeiten]