std::deque<T,Allocator>::insert
| (1) | ||
iterator insert( const_iterator pos, const T& value ); |
||
iterator insert( const_iterator pos, T&& value ); |
(2) | (с C++11) |
| (3) | ||
iterator insert( const_iterator pos, size_type count, const T& value ); |
||
| (4) | ||
template< class InputIt > iterator insert( const_iterator pos, InputIt first, InputIt last ); |
||
iterator insert( const_iterator pos, std::initializer_list<T> ilist ); |
(5) | (с C++11) |
Вставляет элементы в указанное место в контейнере.
value перед pos. count копий value перед pos. [first, last) перед pos.
|
Этот перегрузчик имеет тот же эффект, что и перегрузчик (3), если |
(до C++11) |
|
Этот перегрузчик участвует в разрешении перегрузки только если |
(с C++11) |
first и last являются итераторами в *this.
ilist перед pos. Все итераторы (включая итератор end()) становятся недействительными. Ссылки также становятся недействительными, за исключением случаев pos == begin() или pos == 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 должны удовлетворять требованиям 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) |
то функция не оказывает никакого эффекта (сильная гарантия исключений).
|
Если исключение выбрасывается при вставке одного элемента в любой конец, функция не оказывает никакого эффекта (сильная гарантия исключений). В противном случае, если исключение выбрасывается конструктором перемещения для |
(с C++11) |
Пример
#include <iostream>
#include <iterator>
#include <deque>
void print(int id, const std::deque<int>& container)
{
std::cout << id << ". ";
for (const int x : container)
std::cout << x << ' ';
std::cout << '\n';
}
int main ()
{
std::deque<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);
// reset `it` to the begin:
it = c1.begin();
std::deque<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 | сложность была указана только для вставки одного элемента |
также указана для вставки нескольких элементов |
См. также
|
(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/deque/insert