std::
list::insert
公众成员函数 <list>
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<value_type> il); |
插入元素
通过在指定位置的元素之前插入新元素来扩展容器。元素数量增加.
与其他标准序列容器不同,
list和forward_list对象被专门设计为能够在任意位置高效地插入和删除元素,即使是在序列的中间。
参数决定插入多少元素以及初始化元素的值:
☲ 参数
-
position
-
在容器中插入新元素的位置。
Iterator是一种成员类型,定义为指向元素的双向迭代器类型。
-
val
-
要复制(或移动)到插入元素中的值。
成员类型value_type是容器中元素的类型,在list中定义为它的第一个模板形参(T)的别名。
-
n
-
要插入的元素数目。每个元素都被初始化为val的副本。
成员类型size_type是一个unsigned整型。
-
first, last
-
指定元素范围的迭代器。将[first,last]范围内元素的副本插入position(顺序相同)。
使用的范围是[first,last],它包括first和last之间的所有元素,
包括first指向的元素,但不包括last指向的元素。
函数模板实参InputIterator应该是一个输入迭代器类型,
它指向可以构造value_type对象类型的元素。
-
il
-
一个初始化列表对象。这些元素的副本被插入到position(以相同的顺序)。
这些对象是由初始化器列表声明符自动构造的。
成员类型value_type是容器中元素的类型,在 list中定义为其第一个模板形参(T)的别名。
☉ 返回值
指向新插入的第一个元素的迭代器。
成员类型迭代器是指向元素的双向迭代器类型。
新元素的存储是使用容器的分配器分配的,失败时可能抛出异常
(对于默认分配器,如果分配请求没有成功,将抛出bad_alloc)。
☣ 示例
// inserting into a list
#include <iostream>
#include <list>
#include <vector>
int main ()
{
std::list<int> mylist;
std::list<int>::iterator it;
// set some initial values:
for (int i=1; i<=5; ++i) mylist.push_back(i); // 1 2 3 4 5
it = mylist.begin();
++it; // it points now to number 2 ^
mylist.insert (it,10); // 1 10 2 3 4 5
// "it" still points to number 2 ^
mylist.insert (it,2,20); // 1 10 20 20 2 3 4 5
--it; // it points now to the second 20 ^
std::vector<int> myvector (2,30);
mylist.insert (it,myvector.begin(),myvector.end());
// 1 10 20 30 30 20 2 3 4 5
// ^
std::cout << "mylist contains:";
for (it=mylist.begin(); it!=mylist.end(); ++it)
std::cout << ' ' << *it;
std::cout << '\n';
return 0;
} |
输出:
mylist contains: 1 10 20 30 30 20 2 3 4 5
✥ 复杂度
插入的元素数量呈线性(复制/移动结构)。
☣ 迭代器的有效性
不变。
⇄ 数据竞争
容器修改。
不访问包含的元素。并发地访问或修改不同的元素是安全的,但是迭代包含位置的范围则不安全。
☂ 异常安全性
强保证:如果抛出异常,容器中不会有任何变化。
如果元素结构的适当参数不支持allocator_traits::构造,或者指定了无效的位置或范围,它将导致未定义行为。
🍄 另请参阅
list::splice |
从另一个list转移元素(公众成员函数) |
list::merge |
合并已排序的容器(公众成员函数) |
list::push_back |
在末尾添加元素(公众成员函数) |
list::push_front |
在开头插入元素(公众成员函数) |
list::erase |
删除元素(公众成员函数) |