17.3迭代器适配器
为特殊的迭代器,分为两组.
第一组适配器从容器中创建, 通常作为输出迭代器:
back_insert_iterator
:使用push_back()
将元素插入容器中front_insert_iterator
:使用push_front()
将元素插入容器中insert_iterator
:使用insert()
将元素插入容器中
第二组适配器是通过另一个迭代器创建的,不是容器,通常作为输入迭代器.
reverse_iterator
:反转另一个迭代器的迭代顺序move_iterator
:move_iterator
的解引用运算符自动将左值转换为右值引用,因此可以将其移动到新目标
1.插入迭代器
基本的 insert_iterator
调用容器上的insert(position,element)
,back_insert_iterator
调用 push_back(element)
,front_insert_iterator
调用 push_front(element)
。
std::vector<int> iVec{1,2,3,4,5,6,7,8,9,10},iVec2{iVec};
std::cout<<fmt::format("\n{}\n",sum(cbegin(iVec),cend(iVec)));
myCopy(cbegin(iVec),cend(iVec),std::ostream_iterator<int>{std::cout," "});
std::cout<<'\n';
std::back_insert_iterator<std::vector<int>> bIter{std::back_inserter(iVec)};
myCopy(cbegin(iVec2)+5,cend(iVec2),bIter);
myCopy(cbegin(iVec),cend(iVec),std::ostream_iterator<int>{std::cout," "});
std::cout<<'\n';
//output
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10 6 7 8 9 10
使用 insert_iterator
的一个好处是∶它允许使用关联容器作为修改算法的目标
std::vector<int> iVec{1,2,3,4,5,6,7,8,9,10};
set<int> iSet;
insert_iterator<set<int>> sbIter{iSet,begin(iSet)};
myCopy(cbegin(iVec),cend(iVec),sbIter);
myCopy(cbegin(iSet),cend(iSet),ostream_iterator<int>{cout," "});
cout<<'\n';
//output
1 2 3 4 5 6 7 8 9 10
2.逆向迭代器
std::reverse_iterator<T>
将operator++
应用到reverse_itertor
将调用底层容器迭代器的operator--
3.移动迭代器
库提供了一个名为 std::move_iterator
的迭代器适配器。move_iterator
的解引用运算符自动将左值转换为右值引用,这意味着可以将左值移动到新的目标,而不必复制开销。