"const_iterator"真的需要与"迭代器"是不同的类吗?
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
构造函数的指针是非常量。
理想的解决方案是类似于返回 const 对象的特定构造函数:
const A::iterator( const StringUtfInterface *p, size_t s); //Not valid
这(显然(在C++无效。我想知道解决这个问题的方法是什么?
我真的需要声明/定义一个新的const_iterator类吗?const
关键词还不够?
相关问题(但不相同(:
- 为什么C++没有常量构造函数?
- 获取迭代器以供常量参考
const
关键字还不够?
实际上,const
关键字太多了:它迫使你写
const A::iterator it = a.cbegin();
这会阻止您以后使用++it
。
您需要提供两个单独的类,但这并不意味着您必须编写两次代码。您可以构造迭代器的实现,以便执行所有工作的公共类嵌入到常量和非常量迭代器实现中,从而向调用方公开嵌入式实现的相关方法。
只是重载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); }
//...
};
相关文章:
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 将一个向量映射到不同的对,即使向量映射到每对时是不同的?
- int* 和 int** 是不同的类型吗?C++
- C++问题,我的两个源代码应该具有相同的输出,但它们是不同的
- 通过 char* 缓冲区读取 int 的行为是不同的,无论是正数还是负数
- OpenSSL:读取EC密钥,然后再次写入,这是不同的
- "const_iterator"真的需要与"迭代器"是不同的类吗?
- C++ 如果 Printf 位于函数中,则返回是不同的
- 在C 字符串中,为什么在最后一个字符之后,通过索引和()访问索引时行为是不同的
- 我正在比较两个具有相同值的变量,但它说它们是不同的
- 是一个被认为是不同类型的班级内部的正向声明
- 对于不同的消息,OpenSSL 签名长度是不同的
- 结果是不同的;C++ 中的 recv(sock,buf,sizeof(buf),0) 和 strlen(buf)
- 为什么推导出的乐趣(T t)和乐趣(T && t)的类型在C++中是不同的?
- 为什么C++编译器不优化对结构数据成员的读取和写入,而不是不同的局部变量?
- 使用模板在核心类型不同的不同项目中使用通用代码,这些项目的核心类型在 c++ 中是不同的
- python 和 c++ 的结果对于嵌套的 for 语句是不同的
- PCL中的这些增强指针初始化是不同的
- 一次又一次的恐惧。这是不同的
- 在C 中按行读取文本文件,每行都是不同的数据类型