std::vector::insert
Z cppreference.com
(1) | ||
iterator insert( iterator pos, const T& value ); |
(do C++11) | |
iterator insert( const_iterator pos, const T& value ); |
(od C++11) | |
iterator insert( const_iterator pos, T&& value ); |
(2) | (od C++11) |
(3) | ||
void insert( iterator pos, size_type count, const T& value ); |
(do C++11) | |
iterator insert( const_iterator pos, size_type count, const T& value ); |
(od C++11) | |
(4) | ||
template< class InputIt > void insert( iterator pos, InputIt first, InputIt last); |
(do C++11) | |
template< class InputIt > iterator insert( const_iterator pos, InputIt first, InputIt last ); |
(od C++11) | |
iterator insert( const_iterator pos, std::initializer_list<T> ilist ); |
(5) | (od C++11) |
Wstawia elementy na określoną pozycję w kontenerze.
1-2) wstawia value przed pos
3) wstawia count kopii value przed pos
4) wstawia elementy z zakresu [first, last) przed pos.
Zachowanie jest niezdefiniowane, jeśli first i last są iteratorami po elementach *this.
To przeciążenie ma identyczny efekt, jak (3) jeśli InputIt jest typem całkowitym. | (do C++11) |
To przeciążenie bierze udział w rozwiązywaniu przeciążeń(ang) tylko jeśli InputIt kwalifikuje się jako InputIterator, aby uniknąć niejednoznaczności z przeciążeniem (3). | (od C++11) |
5) wstawia elementy z listy inicjalizacyjnej ilist przed pos.
Powoduje realokację, jeśli nowy rozmiar size() jest większy niż stara pojemność capacity(). Jeśli nowy rozmiar size() jest większy niż capacity(), wszystkie iteratory i referencje są unieważnione. W przeciwnym wypadku, tylko iteratory i referencje na elementy występujące przed punktem wstawienia pozostają prawidłowe. Iterator zakońcowy w obu przypadkach jest również unieważniony.
Spis treści |
[edytuj] Parametry
pos | - | iterator, przed którym zostaną wstawione nowe elementy. pos może być iteratorem end() |
value | - | wartość elementu do wstawienia |
first, last | - | zakres, z którego będą wstawiane elementy, nie mogą być to iteratory po kontenerze, który wywołuje tę metodę |
ilist | - | lista inicjalizacyjna, z której będą wstawiane elementy |
Wymagania względem typów | ||
-T musi spełniać wymagania CopyAssignable i CopyInsertable aby użyć przeciążenia (1). | ||
-T musi spełniać wymagania MoveAssignable i MoveInsertable aby użyć przeciążenia (2). | ||
-T musi spełniać wymagania CopyAssignable i CopyInsertable aby użyć przeciążenia (3). | ||
-T musi spełniać wymagania EmplaceConstructible aby użyć przeciążenia (4,5). | ||
-T musi spełniać wymagania MoveAssignable i MoveInsertable aby użyć przeciążenia (4). required only if InputIt satisfies InputIterator but not ForwardIterator. (do C++17) | ||
-T musi spełniać wymagania Swappable , MoveAssignable , MoveConstructible i MoveInsertable aby użyć przeciążenia (4,5). (od C++17) |
[edytuj] Zwracana wartość
1-2) Iterator wskazujący na wstawiony element value
3) Iterator wskazujący na pierwszy wstawiony element, lub pos jeśli count==0.
4) Iterator wskazujący na pierwszy wstawiony element, lub pos jeśli first==last.
5) Iterator wskazujący na pierwszy wstawiony element, lub pos jeśli lista inicjalizacyjna ilist jest pusta.
[edytuj] Złożoność
1-2) Stała plus liniowa względem odległości między pos a końcem kontenera.
3) Liniowa względem count plus liniowa względem odległości między pos a końcem kontenera.
4) Liniowa względem std::distance(first, last) plus liniowa względem odległości między pos a końcem kontenera.
5) Liniowa względem ilist.size() plus liniowa względem odległości między pos a końcem kontenera.
[edytuj] Wyjątki
Jeśli zostanie wyrzucony wyjątek podczas wstawiania pojedynczego elementu na końcu, i T jest CopyInsertable lub std::is_nothrow_move_constructible<T>::value jest true, zawartość kontenera nie zostanie zmieniona (strong exception guarantee).
Przykład
#include <iostream> #include <vector> void print_vec(const std::vector<int>& vec) { for (auto x: vec) { std::cout << ' ' << x; } std::cout << '\n'; } int main () { std::vector<int> vec(3,100); print_vec(vec); auto it = vec.begin(); it = vec.insert(it, 200); print_vec(vec); vec.insert(it,2,300); print_vec(vec); // "it" no longer valid, get a new one: it = vec.begin(); std::vector<int> vec2(2,400); vec.insert(it+2, vec2.begin(), vec2.end()); print_vec(vec); int arr[] = { 501,502,503 }; vec.insert(vec.begin(), arr, arr+3); print_vec(vec); }
Wynik:
100 100 100 200 100 100 100 300 300 200 100 100 100 300 300 400 400 200 100 100 100 501 502 503 300 300 400 400 200 100 100 100
[edytuj] Zobacz także
(C++11) |
konstruuje element "w miejscu" (publiczna metoda) |
dodaje element na koniec (publiczna metoda) |