`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
关键字不够?
相关问题(但不一样):
- Why does C++ not have a const constructor?
重载 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 嵌入到常量和非常量迭代器实现中,这将嵌入式实现的相关方法公开给调用者。
假设我定义了某种容器 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
关键字不够?
相关问题(但不一样):
- Why does C++ not have a const constructor?
重载 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 嵌入到常量和非常量迭代器实现中,这将嵌入式实现的相关方法公开给调用者。