10.4 再探迭代器
标准库的头文件iterator,除了定义了容器的迭代器之外,还定义了一些额外的迭代器。
- 插入迭代器 insert iterator
- 流迭代器 stream ierator
- 反向迭代器 reverse iterator
- 移动迭代器 移动迭代器在13.6中,解引用移动迭代器将得到一个右值引用。
接下来总结每个迭代器具体是做什么的
10.4.1插入迭代器
插入迭代器是一种迭代器适配器,其接受一个容器,生成一个迭代器,对该迭代器赋值时,这个迭代器将调用容器操作将赋值的元素添加进容器。
插入迭代器有三个。
1.back_inserter
2.front_inserter
3.inserter
backi_inserter调用容器的push_back()操作,前提是容器有push_back()操作,添加之后的元素为顺序
front_inserter()调用容器的push_front()操作,前提是容器有push_front()操作,添加之后的元素为逆序。
inserter()需要指定容器和插入的位置,指向insert操作,inserter将元素插入到指定的元素之前,所以添加之后的元素为顺序。
插入迭代器支持的操作:
其实只有赋值有用,其余的操作返回的都是插入迭代器自己。
练习
10.26
有什么不同指出,已经在上面写出来了
10.27
vector<string> vec = {
"a","c","a","e123","1ca","aaa","aaa","z123","q","casd123","asdas" };
deque<string> dq;
std::sort(vec.begin(),vec.end());
std::unique_copy(vec.begin(),vec.end(),std::back_inserter(dq));
for (const auto& item:dq) {
cout << item << endl;
}
cout << "size:" << dq.size() << endl;
10.28
错误记录:这里我犯了一个错误就是,认为传给算法的迭代器在每次赋值的使用都调用一次,所以inserter传入begin(),每次都在首元素之前插入,那插入的元素不就是逆序吗,但是其实是只在调用时begin()指的还是首元素或者最后一个元素的下一位置,在插入了其他的元素之后,它就不再是首元素了。
vector<int> vec = {
1,2,3,4,5,6,7,8,9};
vector<int> vec_1;
list<int> lst_1;
deque<int> dq_1;
//顺序
std::copy