2013-05-10 191 views
-2

我想对我的代码发表意见。我需要一个随机访问迭代器来定制容器。 如果我读的C++标准2011,特别是第24章,我明白了一个实现 可能是以下几点:在C++ 2011中创建自定义随机访问迭代器

class my_iterator : public std::iterator<std::random_access_iterator_tag, my_element> 
{ 
    private: 
     my_container *_ref; 
     my_iterator_state state; // some useful state 
    public: 
     my_iterator(); 
     my_iterator (const my_iterator &); 
     my_iterator (my_iterator &&); 
     ~my_iterator(); 
     my_iterator &operator = (const my_iterator &); 
     my_iterator &operator = (my_iterator &&); 
     reference operator *(); 
     my_iterator &operator ++(); 
     bool operator != (my_iterator); 
     value_type operator *(); 
     pointer operator ->(); 
     my_iterator &operator *(); 
     void operator ++ (int); 
     value_type operator ++ (int); 
     const my_iterator &operator ++ (int); 
     reference operator ++ (int); 
     my_iterator &operator --(); 
     const my_iterator operator -- (int); 
     reference operator -- (int); 
     my_iterator &operator += (difference_type); 
     my_iterator operator + (difference_type); 
     my_iterator operator - (difference_type); 
     reference operator [] (difference_type); 
     bool operator < (my_iterator); 
     bool operator > (my_iterator); 
     bool operator <= (my_iterator); 
     bool operator >= (my_iterator); 
     friend difference_type (my_iterator, my_iterator); 
     friend my_iterator operator + (difference_type, my_iterator); 
     friend void swap (iterator &, iterator &); 
}; 

void swap (iterator &, iterator &); 
difference_type (my_iterator, my_iterator); 
my_iterator operator + (difference_type, my_iterator); 

以上实施是正确的,功能齐全,?有太多成员?

+4

呵呵,是的。请自己做一个服务并使用'boost :: iterator_facade'。 – 2013-05-10 14:31:16

+0

欢迎来到Stack Overflow。请花时间阅读 [faq]。你会得到一个[徽章](http://stackoverflow.com/badges)(c: – 2013-05-10 14:32:35

+0

你可能会更好的问这个[codereview.se] – 2013-05-10 14:33:08

回答

3

一般来说,您不能使用具有相同参数但返回类型不同的重载,因此您的几个成员不能存在。你应该记住以下:

reference operator *(); 
my_iterator operator ++ (int); 
my_iterator operator -- (int); 

并取出假重载:

value_type operator *(); 
void operator ++ (int); 
value_type operator ++ (int); 
const my_iterator &operator ++ (int); 
reference operator ++ (int); 
const my_iterator operator -- (int); 
reference operator -- (int); 

这是没有意义的:

friend difference_type (my_iterator, my_iterator); 

,我认为应该是:

friend difference_type operator-(my_iterator, my_iterator); 

,你似乎失踪了operator-=

+0

确实是'friend difference_type(my_iterator,my_iterator);'是打字错误:) – 2013-05-10 18:02:46