[1]顺序容器的插入操作:push_front,push_back之类的操作很简单,但是不支持在随机位置插入元素.
insert(p,10,t)在迭代器p之前插入10个t.
insert(p,t)在迭代器p之前插入t.
insert(p,b,e)在迭代器p之前插入b,e范围的元素.
insert(p,{“”“”})在迭代器p之前插入一个初始化列表.
所有操作返回第一个插入元素的迭代器.如果没有插入,返回p。
[1]练习:利用insert返回值,可以反复在一个特定位置插入元素
int main()
{
deque<string> lst;
string word;
auto iter = lst.begin();
while (cin >> word)
{
iter = lst.insert(iter,2, word);
}
return 0;
}
[2]练习:从一个list〈int〉中拷贝元素,奇数的拷贝到一个vector〈int〉容器,偶数的拷贝到另一个容器.
list<int> L{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
vector<int> vec1, vec2;
for (const auto &it : L)
((it % 2) ? (vec1) : (vec2)).push_back(it);
[3]注意插入操作后迭代器会失效,需要重新赋值
VecInt vc(10, 1);
auto cursor = vc.size() / 2;
VecInt::iterator iter = vc.begin(), mid = iter + cursor;
while (iter!=mid)
{
iter = vc.insert(iter, 2,3);
++iter;
mid = vc.begin() + vc.size() / 2;
}
[4]成员函数back,front返回的是一个引用,可以v.back() = value来改变容器元素.但是注意auto it = v.back(),it只是一个拷贝.
[5]非成员函数begin(),end()可以兼容所有STL容器以及c的数组.
练习:从int[]数组中拷贝数据到list〈int〉与vector〈int〉,然后分别删除奇数与偶数.
//一定要在erase后将迭代器更新!
int ia[] = {0,1,1,2,3,5,8,13,21,55,89};
VecInt vc(ia,end(ia));
list<int> vl(ia,end(ia));
auto it = vc.begin();
auto it2 = vl.begin();
while (it != vc.end())
(*it % 2) ? (++it, it2 = vl.erase(it2)) : (it = vc.erase(it), ++it2);
return 0;