我正在为库编写一个迭代器类(比如MyIterator
)。
使用const重载来制作是个好主意
const MyIterator
的行为类似于const_iterator
std::vector
,而MyIterator
的行为与iterator
std::vector
的行为相同?
库用户/开发人员会感到困惑吗?
实施将如下:
// 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迭代器的迭代器类。我目前正在这样做(我听说提升正在这样做......)。但是,随着我实现范围,然后范围范围(如基于循环的嵌套范围),模板变得非常复杂。
答案 0 :(得分:7)
使用const MyIterator
代替const_MyIterator
(const_iterator
)将不起作用,因为const_iterator
并不是一个常量迭代器,而是一个迭代迭代器常量元素。
此外,对于const MyIterator
,您无法使用修改运算符,如++
或--
,因为这些是非const方法,修改迭代器本身。
所以,如果你想提供某种const_iterator
,你就不会实现它。
库用户/开发人员会感到困惑吗?
最后,回答你的问题:是的,我想是的,因为const iterator
vs const_iterator
的行为(和期望)不同。