自定义的迭代器

当我们自己写一个迭代器的时候,我们需要为迭代器提供一个的迭代器特性,方法有以下两种:

1.提供必要的五种型别定义,就像iterator_traits结构

2.提供一个特化版本的iterator_traits结构。


关于第一种方法,c++标准程序库中提供了一个特殊基本类别iterator<>,专门用来进行这类别定义。你只需这样指定型别:

class Myiterator:: public std::iterator<std::bidirectional_iterator_tag , type , std::prtdiff_t , type* , type&>{

...

};

第一个templete参数用来定义迭代器类型,第二个参数用来定义元素型别,第三个参数用来定义距离型别,第四个参数用来定义pointer型别,第五个参数用来定义reference型别。最后三个参数有默认值,通常不用定义。


以下是如何编写自定义的迭代器:

#include<iterator>


template<class Container>
class asso_insert_iterator :public std::iterator<std::output_iterator_tag, void, void, void, void>{
protected:
Container &container;
public:
explicit asso_insert_iterator(Container &c) :container(c){


}


asso_insert_iterator<Container>&
operator= (const typename Container::value_type &value){
container.insert(value);
return *this;
}


asso_insert_iterator<Container>& operator*(){
return *this;
}


asso_insert_iterator<Container>& operator++(int){
return *this;
}




};




template<class Container>
inline asso_insert_iterator<Container>asso_inserter(Container& c){
return asso_insert_iterator<Container>(c);
}



此迭代器将容器储存在其成员container中,所有经由赋值而来的值都通过insert()安插到容器内,operator*和operator++只是传回迭代器本身,并无实际动作。

#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
#include"Header.h"
#include"Header1.h"


int main()
{
set<int> coll;
asso_insert_iterator<set<int> >iter(coll);
*iter = 1;
iter++;    //operator++ , operator* 并无实际动作
*iter = 2;
//iter++;
*iter = 3;
//iter++;


Print_Elements(coll);


asso_inserter(coll) = 45;
asso_inserter(coll) = 55;


Print_Elements(coll);


/*int vals[] = { 33, 67, -4, 13, 5, 1 };
copy(vals, vals + (sizeof(vals) / sizeof(vals[0])), 
asso_inserter(coll));
Print_Elements(coll);
*/
getchar();
getchar();


}

程序的输出结果如下:

1 2 3
1 2 3 45 55


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值