17.3迭代器适配器

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 的解引用运算符自动将左值转换为右值引用,这意味着可以将左值移动到新的目标,而不必复制开销。

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值