2012-04-20 25 views
0

我擴大與自定義的容器STL容器,所以,如果我提供的元素它無法定義常量性,從它的對手迭代

class MyContainer; 

template <typename T> class myiterator :public iterator<bidirectional_iterator_tag, T> 
{ 
    friend class MyContainer; 
    private: 
    T *pointer; 

    myiterator(T *pt):pointer(pt) {} 

    public: 
    T& operator*() {return (*pointer);} 

    const myiterator<T>& operator++() 
    { 
     pointer->current_iterator++; 
     return *this; 
    } 

    bool isEnd(void) const 
    { 
     return pointer->current_iterator == pointer->data.end(); 
    } 
    }; 

class MyContainer 
{ 
    friend class myiterator<MyContainer>; 
    public: 
    typedef myiterator<MyContainer> iterator; 
    typedef myiterator<MyContainer const> const_iterator; 

    private: 
    map<int, int> data; 
    map<int, int>::const_iterator current_iterator; 

    public: 
    MyContainer() {current_iterator = data.begin(); } 

    void addDataPair(int key, int value) {data[key] = value;} 

    int first() const {return (*current_iterator).first;} 
    int second() const {return (*current_iterator).second;} 

    iterator begin() 
    { 
     current_iterator = data.begin(); 
     return iterator(this); 
    } 

    const_iterator begin() const 
    { 
     return const_iterator(this); 
    } 
    }; 

此代碼運行正常的操作更加靈活的控制,使用迭代器如下

MyContainer h; 

h.addDataPair(1, 1); 
h.addDataPair(2, 2); 
h.addDataPair(3, 3); 

for (MyContainer::iterator it=h.begin(); !it.isEnd(); ++it) 
{ 
    cout << (*it).first() << " " << (*it).second() << endl; 
} 

但它不會編譯,如果我改變迭代器到const_iterator。我讀過一篇文章,其中提到要定義常量迭代器,我們只需將X中的value_type替換爲X const,這就是我在代碼中所做的。但是我很快發現它可能不適用於我的情況,因爲迭代器返回的引用是我自己的容器本身。我不知道如何讓const_iterator工作而不重複編碼。

此外,我的迭代器是從std :: iterator派生的,但是我發現我無法覆蓋我的迭代器的構造函數 。除了T * pt之外,我可以通過任何方式將多個參數傳遞給我的迭代器嗎?謝謝。

+0

這有點奇怪。 MyContainer看起來既是一個容器又是一個迭代器。 – 2012-04-20 04:23:31

+0

我知道:)因爲我不想讓代碼直接修改地圖的元素,所以我編寫了一個包裝來控制它,而他們試圖通過operator [],operator ++等來訪問地圖數據。我是要繼承std :: map來這樣做,但似乎不建議這樣做是因爲虛擬析構函數。無論如何,這是我能想到的將接口保持爲貼圖並添加一些控件的唯一方法。 – user1285419 2012-04-20 04:32:27

+0

你想要一個常量圖不提供什麼? – 2012-04-20 04:41:09

回答

1

第一個問題:

如果更改此:

for (MyContainer::iterator it=h.begin(); !it.isEnd(); ++it) 

for (MyContainer::const_iterator it=h.begin(); !it.isEnd(); ++it) 

,那麼你從begin()end()得到一個非const iterator,並嘗試初始化從const_iterator它,但這是一個不同的類型,你的my_iterator模板沒有一個構造函數允許從另一種類型的建築。

您可以修復通過添加:

template<typename> friend class myiterator; 

template<typename T2> 
    myiterator(myiterator<T2> const& i) : pointer(i.pointer) { } 

您還應該operator*常量(它不會改變迭代器取消對它的引用。)

但還有一個更大的問題,一個const_iterator指向const MyContainer,但const_iterator::operator++需要更改該對象,但它不能,因爲它是常量。所以你不能增加你的const_iterator,即不能用它迭代!你可能想重新考慮這個設計。

相關問題