本章内容均从c++ primer摘录总结
所有容器除array外,都支持动态的添加操作,但c++顺序容器添加元素的方法可以说是五花八门,让人眼花缭乱,下面总结了一下容器进行插入操作常用的函数和算法:
顺序容器与关联容器在使用时最本质的区别是,顺序容器是通过元素位置去操作容器,而关联容器是通过元素值去操作容器。因此,对于顺序容器的添加操作主要需要掌握在容器的头部,尾部,以及任意位置添加一个或者多个元素的方法。
注意:以下array容器均不支持。
1.头部添加元素
方法1:采用push_front, emplace_front: vector不支持此操作
list<pair<int, string>> list;
list.push_front(make_pair<int, string>(10, "hello"));
list.emplace_front(12,"hello");
方法2.非forward_list容器,可以使用insert, emplace,返回新添加第一个插入元素的迭代器
li.insert(li.begin(), make_pair<int, string>(13, "hello"));
li.emplace(li.begin(), 14, "hello");
方法3.forwar_list可以使用insert_after,emplace_after,返回最后一个插入元素的迭代器
//forward_list容器
forward_list<pair<int, string>> fli;
fli.insert(fli.before_begin(), make_pair<int, string>(13, "hello"));
fli.emplace(fli.before_begin(), 14, "hello");
方法4.使用前置插入迭代器front_iterator插入多个元素
list<int> li = {1,1,2,2,3,3,4,4};
forward_list<int> fli_1, fli_2;
unique_copy(li.begin(), li.end(), front_inserter(fli_1)); //fli_1:4,3,2,1
unique_copy(li.rbegin(), li.rend(), front_inserter(fli_2));//fli_2:1,2,3,4
2.任意位置添加多个元素,具体方法与在头部添加一个元素大同小异。
方法1:非forward_list容器三种方式
c.insert(p, b, e) //p为目的容易位置,[b,e)为一对迭代器,
//返回新添加第一个插入元素的迭代器
c.insert(p, n, t) //插入n个相同的t与元素
c.insert(p, li) //li为元素值列表
方法2:forward_list
c.insert_after(p, b, e) //p为目的容易位置,[b,e)为一对迭代器,
//返回新添加第一个插入元素的迭代器
c.insert_after(p, n, t) //插入n个相同的t与元素
c.insert_after(p, li) //li为元素值列表
方法3.使用inserter迭代器
list<int> li = {1,1,2,2,3,3,4,4};
vector<int> vec = {10,11,12,13,14};
vector<int> vec_new;
//vec_new1:4,3,2,1
unique_copy(li.begin(), li.end(), back_inserter(vec_new));
//vec_new1 2 10 11 12 13 14 3 4
unique_copy(vec.begin(), vec.end(), inserter(vec_new, vec_new.begin() + 2));
3.在末尾插入元素(以下方法forward_list均不支持)
方式1:使用push_back,emplace_back
list<pair<int, string>> list;
list.push_back(make_pair<int, string>(10, "hello"));
list.emplace_back(12,"hello");
方法2:可以使用insert, emplace
li.insert(li.end(), make_pair<int, string>(13, "hello"));
li.emplace(li.end(), 14, "hello");
方法3.使用尾置插入迭代器back_iterator插入多个元素
list<int> li = {1,1,2,2,3,3,4,4};
vec<int> vec_1, vec_2;
unique_copy(li.begin(), li.end(), back_inserter(vec_1)); //vec_1:1,2,3,4
unique_copy(li.rbegin(), li.rend(), back_inserter(vec_2));//vec_2:4,3,2,1