Przestrzenie nazw
Warianty

std::set::insert

Z cppreference.com
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>
std::pair<iterator,bool> insert( const value_type& value );
(1)
std::pair<iterator,bool> insert( value_type&& value );
(2) (od C++11)
(3)
iterator insert( iterator hint, const value_type& value );
(do C++11)
iterator insert( const_iterator hint, const value_type& value );
(od C++11)
iterator insert( const_iterator hint, value_type&& value );
(4) (od C++11)
template< class InputIt > void insert( InputIt first, InputIt last );
(5)
void insert( std::initializer_list<value_type> ilist );
(6) (od C++11)

Wstawia elemet(y) do kontenera, o ile nie zawiera on już wcześniej elementów o identycznym kluczu.

1-2) wstawia value.
3-4) wstawia value na pozycję tak blisko jak to możliwąSzablon:mark to c++11, bezpośrednio przed(od C++11) hint.
5) Wstawia elementy z zakresu [first, last). Jeśli wiele elementów na przedziale ma klucze, które są porównywane jako identyczne, nie jest określone, który element zostanie wstawiony (pending LWG2844).
6) Wstawia elementy z listy inicjalizacyjnej ilist. Jeśli wiele elementów na przedziale ma klucze, które są porównywane jako identyczne, nie jest określone, który element zostanie wstawiony (pending LWG2844).


Żadne iteratory ani referencje nie zostają unieważnione.

Parametry

hint -
iterator, używany jako sugestia, gdzie zacząć szukanie (do C++11)
iterator na pozycję bezpośrednio przed którą ma być wstawiony element (od C++11)
value - element value do wstawienia
first, last - przedział elementów do wstawienia
ilist - lista inicjalizacyjna, z której zostaną wstawione wartości
Wymagania względem typów
-
InputIt musi spełniać wymagania InputIterator.

Zwracana wartość

1-2) Zwraca parę składającą się z iteratora na wstawiony element (lub element, który uniemożliwił wstawienie) i wartości bool ustawionej na true, jeśli wstawienie rzeczywiście nastąpiło.
3-4) Zwraca iterator na wstawiony element, lub na element, który uniemożliwił wstawienie
5-6) (brak)


Wyjątki

1-4) Jeśli zostanie wyrzucony wyjątek przez jakąkolwiek operację, zawartość kontenera nie zostanie zmieniona (strong exception guarantee).

Złożoność

1-2) Logarytmiczna względem rozmiaru kontenera, O(log(size())).
3-4) Amortyzowana stała, o ile wstawienie następuje na pozycji bezpośrednio za wskazówką hint, w przeciwnym wypadku logarytmiczna względem rozmiaru kontenera.
(do C++11)
3-4) Amortyzowana stała, o ile wstawienie następuje na pozycji bezpośrednio przed wskazówką hint, w przeciwnym wypadku logarytmiczna względem rozmiaru kontenera.
(od C++11)
5-6) O(N*log(size() + N)), gdzie N jest liczbą elementów do wstawienia.

Notka

Przeciążenia wstawiające z podpowiedzią (3,4) nie zwracają bool-a aby mieć zgodną sygnaturę ze wstawieniami pozycyjnymi do kontenerów sekwencyjnych, takimi jak std::vector::insert. Pozwala to na stworzenie uogólnionych inserterów, takich jak std::inserter. Jedną z metod sprawdzenia sukcesu operacji jest porównanie wartości size() przed i po wywołaniu tej metody.

Przeciążenia (5,6) są często implementowane jako pętla wywołująca przeciążenie (3) z end() jako wskazówką; są zoptymalizowane do dostawiania na koniec kontenera posortowanych sekwencji (takich jak inny set), których najmniejszy element jest większy niż największy element *this

Przykład

#include <set>
#include <cassert>
#include <iostream>

int main()
{
  std::set<int> set;

  auto result_1 = set.insert(3);
  assert(result_1.first != set.end()); // it's a valid iterator
  assert(*result_1.first == 3);
  if (result_1.second)
    std::cout << "insert done\n";

  auto result_2 = set.insert(3);
  assert(result_2.first == result_1.first); // same iterator
  assert(*result_2.first == 3);
  if (!result_2.second)
    std::cout << "no insertion\n";
}

Wynik:

insert done
no insertion

Zobacz także

(C++11)
konstruuje element "w miejscu"
(publiczna metoda) [edit]
tworzy elementy "w miejscu", korzystając z podpowiedzi
(publiczna metoda) [edit]