我正在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;}
};
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用模板来实现单个迭代器类,该类可以专门用于const和非const迭代器.我目前正在这样做(我听说提升正在这样做......).但是,当我实现范围,然后范围范围(如基于循环的嵌套范围)时,模板变得非常复杂.
使用const MyIterator作为const_MyIterator(const_iterator)的替代将不起作用,因为const_iterator它不是一个常量迭代器,而是迭代在常量元素上的迭代器.
另外,使用a const MyIterator,你不能使用修改运算符,比如++或--,因为这些是非const方法,修改迭代器本身.
所以,如果你想提供某种const_iterator,你就不会实现一个.
图书馆用户/开发人员会感到困惑吗?
最后,回答你的问题:是的,我想是的,因为const iteratorvs的行为(和期望)不同const_iterator.