`const_iterator` 真的需要不同于 `iterator` 的 class 吗?

Does `const_iterator` really need to be a different class than `iterator`?

假设我定义了某种容器 A:

struct A
{
    iterator begin(){ return iterator(this,0); }
    const iterator cbegin() const { return iterator(this, last());}
    //...
};

假设现在我要声明 iterator(A 的一部分):

struct A::iterator
{
    iterator ( A* ptr, size_t idx){};
    //...
};

我会这样使用:

const A a;
A::iterator it = a.cbegin();

那是行不通的,因为传递给 iterator 的构造函数的指针是非常量的。

理想的解决方案是 return const 对象的特定构造函数:

const A::iterator( const StringUtfInterface *p, size_t s); //Not valid

这(显然)在 C++ 中无效。我想知道这个问题的解决方法是什么?

我真的需要 declare/define 一个新的 const_iterator class 吗? const关键字不够?


相关问题(但不一样):

重载 iterator 的构造函数来支持常量容器怎么样?

struct A::iterator {
    iterator(A* ptr, size_t idx) {}
    iterator(const A* ptr, size_t idx) {}
    //...
};

这样就不需要定义两个单独的 类 并且您将始终(隐式地)获得正确的迭代器,具体取决于您的容器常量。

更新

在评论之后,您可以使用一个模板,例如(未完全实现)

struct A {
  template<class T>
  struct base_iterator {
  private:
    T* _ptr;

  public:
    base_iterator(T* ptr, size_t idx) : _ptr(ptr) {}

    T operator*() { return *_ptr; }
    //...
  };

  typedef base_iterator<A> iterator;
  typedef base_iterator<const A> const_iterator;

  iterator begin() { return iterator(this, 0); }
  const_iterator cbegin() const { return const_iterator(this, 0); }
  //...
};

const keyword is not enough?

实际上,const关键字太多了:它迫使你写

const A::iterator it = a.cbegin();

这会阻止您以后使用 ++it

你需要提供两个独立的classes,但这并不意味着你必须将代码写两次。您可以以这样一种方式构建迭代器的实现,即完成所有工作的公共 class 嵌入到常量和非常量迭代器实现中,这将嵌入式实现的相关方法公开给调用者。