【问题标题】:Create const iterator and non const iterator创建 const 迭代器和非 const 迭代器
【发布时间】:2016-11-04 17:23:28
【问题描述】:

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

使用 const 重载是否是个好主意 const MyIterator 的作用类似于std::vectorconst_iteratorMyIterator 的作用类似于std::vectoriterator

图书馆用户/开发者会感到困惑吗?

实现如下:

// 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 迭代器。我目前正在这样做(我听说 boost 正在这样做......)。但是,随着我实现范围,然后是范围范围(如基于 for 循环的嵌套范围),模板很快变得复杂。

【问题讨论】:

  • 到底是mit?可能会回答你的问题。
  • @George 我把它当作迭代器称为mit。可能是my_iterator 的简写。
  • 我会感到困惑,但这只是我。
  • 我不清楚你在问什么,但 const_iterator 是一个指向 const 事物的迭代器,而 const 迭代器是一个不能指向其他事物的迭代器.
  • A const iteratorconst_iterator 在逻辑上是不同的,我建议您不要混淆这些语义。但我不确定你的问题是否或如何做到这一点。

标签: c++ iterator


【解决方案1】:

使用const MyIterator 代替const_MyIterator (const_iterator) 是行不通的,因为const_iterator 并不是一个常量迭代器,而是一个迭代常量元素的迭代器.

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

因此,如果您想提供某种const_iterator,您将无法实施。

图书馆用户/开发者会感到困惑吗?

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

【讨论】:

  • 它可以工作。当我实现迭代器时,只需要定义哪个属性是可变的。不过,我不确定这是否是个好主意。
  • @dotdotdot 不,这绝对不是是个好主意。仅仅因为某事是可能的并不意味着你应该去做。
  • 是的,你是对的,这在技术上是可能的。但这会增加混乱并违反const对象行为的预期。
  • 在可接受的范围内这样做吗?康拉德·鲁道夫(Konrad Rudolph)在stackoverflow.com/questions/148540/… 上获得 50 多票赞成的答案就是这样做的。
  • 这是不同的,因为const_iterator begin() constend() 都不会修改Piece 对象。他们创建一个新对象(const_iterator),或者从m_shape 获取它,然后返回这个。
猜你喜欢
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 2011-01-10
  • 2011-05-03
  • 1970-01-01
相关资源
最近更新 更多