当我们自己写一个迭代器的时候,我们需要为迭代器提供一个的迭代器特性,方法有以下两种:
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