创建const迭代器和非const迭代器

时间:2016-11-04 17:23:29

标签: c++ iterator

我正在为库编写一个迭代器类(比如MyIterator)。

使用const重载来制作是个好主意 const MyIterator的行为类似于const_iterator std::vector,而MyIterator的行为与iterator std::vector的行为相同?

库用户/开发人员会感到困惑吗?

实施将如下:

// std::iterator example
#include <iostream>     // std::cout
#include <iterator>     // std::iterator, std::input_iterator_tag

class MyIterator : public std::iterator<std::input_iterator_tag, int>
{
  mutable int* p;
public:
  MyIterator(int* x) :p(x) {}
  MyIterator(const MyIterator& mit) : p(mit.p) {}
  MyIterator& operator++() {++p;return *this;}
  MyIterator operator++(int) {MyIterator tmp(*this); operator++(); return tmp;}
  bool operator==(const MyIterator& rhs) {return p==rhs.p;}
  bool operator!=(const MyIterator& rhs) {return p!=rhs.p;}
  const int& operator*() const {return *p;} // <-- const overload
  int& operator*() {return *p;}
};

另一种方法是使用模板来实现一个可以专门用于const和非const迭代器的迭代器类。我目前正在这样做(我听说提升正在这样做......)。但是,随着我实现范围,然后范围范围(如基于循环的嵌套范围),模板变得非常复杂。

1 个答案:

答案 0 :(得分:7)

使用const MyIterator代替const_MyIteratorconst_iterator)将不起作用,因为const_iterator并不是一个常量迭代器,而是一个迭代迭代器常量元素

此外,对于const MyIterator,您无法使用修改运算符,如++--,因为这些是非const方法,修改迭代器本身。

所以,如果你想提供某种const_iterator,你就不会实现它。

  

库用户/开发人员会感到困惑吗?

最后,回答你的问题:是的,我想是的,因为const iterator vs const_iterator的行为(和期望)不同。