【发布时间】:2016-11-04 17:23:28
【问题描述】:
我正在为一个库编写一个迭代器类(比如MyIterator)。
使用 const 重载是否是个好主意
const MyIterator 的作用类似于std::vector 的const_iterator 而MyIterator 的作用类似于std::vector 的iterator?
图书馆用户/开发者会感到困惑吗?
实现如下:
// 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 iterator和const_iterator在逻辑上是不同的,我建议您不要混淆这些语义。但我不确定你的问题是否或如何做到这一点。