2016-11-04 59 views
4

我正在为库编写一个迭代器类(例如MyIterator)。创建常量迭代器和非常量迭代器

是否使用const的重载做出那样的std::vectorMyIterator行径const_iterator像的std::vectoriterator const MyIterator行为是个好主意?

图书馆用户/开发人员会感到困惑吗?

的实施将是这样的:

// 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和non-const的迭代器一个迭代器类。我目前正在这样做(我听到助力是这样做的...)。但是,当我实现范围时,模板变得非常快速,然后范围的范围(如基于循环的嵌套范围)。

+1

地狱是一个'mit'?可能回答你的问题。 – George

+1

@George我把它当作迭代器被称为'mit'。可能是'my_iterator'的缩写。 – NathanOliver

+0

我会感到困惑,但那只是我。 – jrok

回答

7

使用const MyIterator作为const_MyIteratorconst_iterator)的替代品将不工作,因为const_iterator并不意味着是一个常数迭代器,但一个迭代遍历常量元素

此外,与const MyIterator,您不能使用修改运算符,如++--,因为这些是非const方法,修改迭代器本身。

所以,如果你想提供某种const_iterator,你不会执行一个。

图书馆用户/开发人员会感到困惑吗?

最后,要回答你的问题:是的,我是这么认为的,因为一个const iterator VS const_iterator的不同的行为(和期望)。

+0

它可以工作。只需要在实现迭代器时定义哪个属性是可变的。但我不确定这是否是一个好主意。 –

+0

@dotdotdot不,它绝对不*是个好主意。只是因为有些事情可能并不意味着你应该这样做。 –

+0

是的,你是对的,这在技术上是可能的。但是这会增加混淆并且违背const对象行为的期望。 –