std::
deque::insert
公众成员函数 <deque>
C++98: |
single element (1) |
iterator insert (iterator position, const value_type& val); |
|
fill (2) |
void insert (iterator position, size_type n, const value_type& val); |
|
range (3) |
template <class InputIterator>
void insert (iterator position, InputIterator first, InputIterator last); |
C++11; |
single element (1) |
iterator insert (const_iterator position, const value_type& val); |
|
fill (2) |
iterator insert (const_iterator position, size_type n, const value_type& val); |
|
range (3) |
template <class InputIterator>
iterator insert (const_iterator position, InputIterator first, InputIterator last); |
|
move (4) |
iterator insert (const_iterator position, value_type&& val); |
|
initializer list (5) |
iterator insert (const_iterator position, initializer_list il);
|
插入元素
deque容器是通过在指定位置的元素之前插入新元素来扩展的。
容器大小增加.
双端队列设计用于从序列的末尾或开头高效地执行插入(和删除)。
在其他位置插入通常比在list或forward_list容器中插入效率低。
形参决定插入多少元素以及初始化元素的值.
☲ 参数
-
position
-
容器中插入新元素的位置。
Iterator是一种成员类型,定义为指向元素的随机访问迭代器类型。
-
val
-
要复制(或移动)到插入元素的值。
容器中的n个元素的每一个都将被初始化为这个值的副本。
成员类型value_type是容器中元素的类型,在deque中定义为其第一个模板形参(T)的别名。
-
n
-
要插入的元素数。每个元素都被初始化为val的副本。
成员类型size_type是一个无符号整型。
-
first, last
-
指定元素范围的迭代器。range [first,last]中的元素的副本被插入到position位置(按照相同的顺序)。
注意,该范围包括first和last之间的所有元素,包括first所指向的元素,但不包括last所指向的元素。
函数模板实参InputIterator必须是一个输入迭代器类型,该类型指向可以构造value_type对象的类型的元素。
-
il
-
一个initializer_list对象。这些元素的副本在position处插入(按照相同的顺序)。
这些对象是由初始化列表声明符自动构造的。
成员类型value_type是容器中元素的类型,在 deque中定义为其第一个模板形参(T)的别名。
☉ 返回值
指向第一个新插入元素的迭代器。
成员类型iterator是一种指向元素的随机访问迭代器类型。
新元素的存储是使用容器的分配器分配的,如果失败,
它可能会抛出异常(对于默认的分配器,如果分配请求不成功,会抛出bad_alloc)。
☣ 示例
// inserting into a deque
#include <iostream>
#include <deque>
#include <vector>
int main ()
{
std::deque<int> mydeque;
// set some initial values:
for (int i=1; i<6; i++) mydeque.push_back(i); // 1 2 3 4 5
std::deque<int>::iterator it = mydeque.begin();
++it;
it = mydeque.insert (it,10); // 1 10 2 3 4 5
// "it" now points to the newly inserted 10
mydeque.insert (it,2,20); // 1 20 20 10 2 3 4 5
// "it" no longer valid!
it = mydeque.begin()+2;
std::vector<int> myvector (2,30);
mydeque.insert (it,myvector.begin(),myvector.end());
// 1 20 30 30 20 10 2 3 4 5
std::cout << "mydeque contains:";
for (it=mydeque.begin(); it!=mydeque.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
} |
输出:
mydeque contains: 1 20 30 30 20 10 2 3 4 5
✥ 复杂度
与插入元素的数量成线性关系(复制/移动构造)。
另外,根据特定的标准库实现,在位置和deque的一个端点之间的元素数量最多为一个线性。
☣ 迭代器的有效性
如果插入发生在序列的开头或结尾,则与该容器相关的所有迭代器都会失效,
但指针和引用仍然有效,它们指向的元素与调用前相同。
如果插入发生在deque容器的其他位置,所有与该容器相关的迭代器、指针和引用都会失效。
⇄ 数据竞争
容器被修改;
如果插入发生在序列的开头或结尾,则不会访问所包含的元素(尽管请参阅上面的迭代器有效性)。
如果发生在其他地方,则并发访问元素是不安全的。
☂ 异常安全性
如果操作在开始或结束插入单个元素,在异常情况下容器中不会发生任何更改(强保证)。
否则,容器将保证以有效状态结束(基本保证)。
如果allocator_traits::construct不支持元素构造的适当参数,
或者指定了无效的位置或范围,则会导致未定义的行为。
🍄 另请参阅
deque::erase |
删除元素(公众成员函数) |
deque::push_back |
在末尾添加元素 (公众成员函数) |
deque::push_front |
在开头插入元素 (公众成员函数) |