标准库 插入迭代器 详解
插入迭代器作用:copy等函数不能改变容器的大小,所以有时copy先容器是个空的容器,如果不使用插入迭代器,是无法使用copy等函数的。
例如下面的代码就是错误的:
list<int> lst{1,2,3,4};
list<int> lst2,lst3;
copy(lst.cbegin(), lst.cend(), lst2.begin());
lst2是个空的容器,copy函数不能扩容容器lst2,所以会发生运行时错误。
用插入迭代器就可以很好的解决上面的问题
list<int> lst{1,2,3,4};
list<int> lst2,lst3;
copy(lst.cbegin(), lst.cend(), inserter(lst3, lst3.begin()));
三种插入迭代器
迭代器 | 功能描述 |
---|---|
back_inserter | 创建一个使用push_back的迭代器 |
front_inserter | 创建一个使用push_front的迭代器 |
inserter | 创建一个使用insert的迭代器,元素插入到指定位置之前 |
inserter的特殊之处:
//假设it是有inserter生成的迭代器
*it = val;//其效果同下面二行代码一样
it = c.insert(it, val);//it指向新加入的元素
++it;//递增it,使它指向原来的元素
例子:
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
using namespace std;
int main(){
//copy函数不会改变容器的大小,但是使用了插入迭代器后,
//就会改变容器的大小了
/*
list<int> lst{1,2,3,4};
list<int> lst2,lst3;
//运行错误,因为lst2是空list,copy函数不会增加容器的大小
//copy(lst.cbegin(), lst.cend(), lst2.begin());
//结果:4,3,2,1
copy(lst.cbegin(), lst.cend(), front_inserter(lst2));
//结果:1,2,3,4
copy(lst.cbegin(), lst.cend(), inserter(lst3, lst3.begin()));
for(auto const &s : lst2){
cout << s << " ";
}
cout << endl;
for(auto const &s : lst3){
cout << s << " ";
}
cout << endl;
*/
//unique_copy 拷贝不重复的元素到新的容器
vector<int> ivec{1,2,1,2,3,4,3,3,3,2,2,1,1,1};
list<int> lst;
sort(ivec.begin(),ivec.end());
unique_copy(ivec.cbegin(), ivec.cend(),back_inserter(lst));
for(auto const &s : lst){
cout << s << " ";
}
cout << endl;
}