std::deque<T,Allocator>::insert
iterator insert( const_iterator pos, const T& value ); | (1) | |
iterator insert( const_iterator pos, T&& value ); | (2) | (начиная с 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) | (начиная с C++11) |
Вставляет элементы в контейнер в указанную позицию.
value перед pos.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 | - |
std::initializer_list для вставки значений из |
| Требования к типам | ||
-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 <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);
}
Вывод:
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/cpp/container/deque/insert