2016-11-04 62 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對象行爲的期望。 –