std::vector<T,Allocator>::insert
| (1) | ||
iterator insert( const_iterator pos, const T& value ); | (до C++20) | |
constexpr iterator insert( const_iterator pos, const T& value ); | (с C++20) | |
| (2) | ||
iterator insert( const_iterator pos, T&& value ); |
(с C++11) (до C++20) | |
constexpr iterator insert( const_iterator pos, T&& value ); | (с C++20) | |
| (3) | ||
iterator insert( const_iterator pos, size_type count, const T& value ); | (до C++20) | |
constexpr iterator
insert( const_iterator pos, size_type count, const T& value );
| (с C++20) | |
| (4) | ||
template< class InputIt > iterator insert( const_iterator pos, InputIt first, InputIt last ); | (до C++20) | |
template< class InputIt > constexpr iterator insert( const_iterator pos, InputIt first, InputIt last ); | (с C++20) | |
| (5) | ||
iterator insert( const_iterator pos, std::initializer_list<T> ilist ); |
(с C++11) (до C++20) | |
constexpr iterator insert( const_iterator pos,
std::initializer_list<T> ilist );
| (с C++20) |
Вставляет элементы в указанном месте контейнера.
value перед pos.count копий value перед pos.[first, last) перед pos. | Этот перегруз имеет тот же эффект, что и перегрузка (3), если | (до C++11) |
| Этот перегруз участвует в разрешении перегрузки только если | (с C++11) |
first и last являются итераторами в *this. ilist перед pos.Если после операции новое значение size() больше старого capacity(), происходит перераспределение, в этом случае все итераторы (включая итератор end()) и все ссылки на элементы становятся недействительными. В противном случае, действительными остаются только итераторы и ссылки перед точкой вставки.
Параметры
| pos | - | итератор перед которым будет вставлено содержимое (pos может быть итератором end()) |
| value | - | значение элемента для вставки |
| count | - | количество элементов для вставки |
| first, last | - | диапазон элементов для вставки, не может быть итераторами в контейнер, для которого вызывается insert |
| ilist | - | список инициализации для вставки значений |
| Требования к типу | ||
-T должен удовлетворять требованиям CopyAssignable и CopyInsertable для использования перегрузки (1). |
||
-T должен удовлетворять требованиям MoveAssignable и MoveInsertable для использования перегрузки (2). |
||
-T должен удовлетворять требованиям CopyAssignable и CopyInsertable для использования перегрузки (3). |
||
-T должен удовлетворять требованиям EmplaceConstructible для использования перегрузки (4,5). |
||
-T должен удовлетворять требованиям MoveAssignable и MoveInsertable для использования перегрузки (4). требуется только если InputIt удовлетворяет LegacyInputIterator, но не LegacyForwardIterator. (до C++17) |
||
-T должен удовлетворять требованиям Swappable, MoveAssignable, MoveConstructible и MoveInsertable для использования перегрузки (4,5). (с C++17) |
||
Возвращаемое значение
value.pos если count == 0.pos если first == last.pos если ilist пуст.Сложность
pos и концом контейнера.count плюс линейная от расстояния между pos и концом контейнера.std::distance(first, last) плюс линейная от расстояния между pos и концом контейнера.ilist.size() плюс линейная от расстояния между pos и концом контейнера.Исключения
Если возникает исключение, кроме случаев:
- броска исключения конструктором копирования
T,
| (с C++11) |
- броска исключения оператором присваивания копирования
T,
| (с C++11) |
- любой
InputItоперации,
эти функции не имеют эффекта (гарантия сильного исключения).
| Если исключение возникает при вставке одиночного элемента в конец, и | (с C++11) |
Пример
#include <iostream>
#include <iterator>
#include <vector>
void print(int id, const std::vector<int>& container)
{
std::cout << id << ". ";
for (const int x : container)
std::cout << x << ' ';
std::cout << '\n';
}
int main ()
{
std::vector<int> c1(3, 100);
print(1, c1);
auto it = c1.begin();
it = c1.insert(it, 200);
print(2, c1);
c1.insert(it, 2, 300);
print(3, c1);
// `it` no longer valid, get a new one:
it = c1.begin();
std::vector<int> c2(2, 400);
c1.insert(std::next(it, 2), c2.begin(), c2.end());
print(4, c1);
int arr[] = {501, 502, 503};
c1.insert(c1.begin(), arr, arr + std::size(arr));
print(5, c1);
c1.insert(c1.end(), {601, 602, 603});
print(6, c1);
}Вывод:
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
Отчеты об ошибках
Следующие отчеты об ошибках, изменяющих поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение, как опубликовано | Корректное поведение |
|---|---|---|---|
| LWG 149 | C++98 | перегрузки (3) и (4) ничего не возвращали | возвращает итератор |
| LWG 247 | C++98 | сложность была указана только для перегрузки (3) | указана для всех перегрузок |
| LWG 406 | C++98 | гарантия сильного исключения также применялась, если исключение брошено при InputIt операции | гарантии нет в этом случае |
См. также
|
(C++11) | создаёт элемент на месте (публичный член-функция) |
| добавляет элемент в конец (публичный член-функция) |
|
создаёт std::insert_iterator типа, определяемого из аргумента (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/vector/insert