以下实例说明如何编写自定义的迭代器。这事一个关联式容器的Insert迭代器,虾米那是其实作代码
#include<iterator>
using namespace std;
//template class for insert iterator for associative containers
template <class Container>
class asso_insert_iterator:public iterator<output_iterator_tag, void, void ,void, void>
{
protected:
Container& container; //contianer in which elements are inserted
public:
//constructor
explicit asso_insert_iterator (Container&c) : container(c){
}
//assignment operator
//inserts a value into the container
asso_insert_iterator<Container>& operator= (const typename Container::value_type& value){
container.insert(value);
return *this;
}
//dereferencing is a no-op that returns the iterator itself
asso_insert_iterator<Container>& operator*(){
return *this;
}
//increment operation is a no-op that returns the iterator itself
asso_insert_iterator<Container>& operator++(){
return *this;
}
asso_insert_iterator<Container>& operator++(int){
return *this;
}
};
//convenience function to create the inserter
template <class Container>
inline asso_insert_iterator<Container> asso_inserter(Container& c)
{
return asso_insert_iterator<Container>(c);
}
这一Insert迭代器定义完成后,还可以提供一个函数asso_inserter(),用来简化迭代器的生成动作和初始化动作。以下程序便是使用这样一个Insert对着一个set安插一些元素:
#include<iostream>
#include<iterator>
#include<set>
#include<algorithm>
#include"assoiter.h"
#include"print.h"
using namespace std;
int main()
{
set<int> coll;
//create inserter for coll
//inconvenient way
asso_insert_iterator<set<int> > iter(coll);
//insert elements with the usual iterator interface
*iter = 1;
iter++;
*iter = 2;
iter++;
*iter = 3;
PRINT_ELEMENTS(coll);
//create inserter for coll and insert elements
//convenient way
asso_inserter(coll) = 44;
asso_inserter(coll) = 55;
PRINT_ELEMENTS(coll);
//use inserter with an algorithm
int vals[] ={33, 67, -4, 13, 5, 2};
copy(vals, vals+(sizeof(vals)/sizeof(vals[0])), asso_inserter(coll));
PRINT_ELEMENTS(coll);
return 0;
}