2017-06-16 16 views
-2

說我有一個地圖,其中的關鍵是int爲了簡單起見,並能夠用最少的編譯示例重現此問題。在我的情況下,關鍵是一個更復雜的野獸。迭代器是否有意識的位置?

我想重複使用此地圖來創建另一張地圖,並使用不同的鍵:說一個enum而不是一個int。爲此,我有兩個功能允許我將int轉換爲enum,反之亦然。

而不是重寫整個班級,我用的組合物,我把我的地圖(在這種情況下map<int,int>在我的新類MYMAP。

我開始用下面的實現,但我有一個自定義的問題迭代器在我的課答:我沒有選擇從std::iterator繼承,也不是來自map<int,int>::iterator但使用的組合物再次來代替:

class myMap 
{ 
private: 
    std::map<int, int> m; 

public: 

    typedef std::map<int, int> map_type; 
    typedef enum { X1=0, X2, X3, INVALID } key_type; 
    typedef int mapped_type; 
    typedef pair<key_type, mapped_type> value_type; 

    /* conversions from int to key_type and vice versa */ 
    friend key_type int2K(int k); 
    friend int K2int(key_type k); 

    class Iterator 
    { 
    private: 
     map_type::iterator it; 
     key_type K; 
    public: 

     Iterator(map_type::iterator & i) : 
       it(i), K(int2K(i->first)) {} //<= Error if i is not valid (points to the end) 
    }; 

    typedef Iterator iterator; 

    iterator end() { return iterator(m.end()); } 
    // other parts of the class skipped for concisness 
}; 

myMap::key_type int2K(int k) { 
    return (k == 0 ? myMap::X1 : 
      (k == 1 ? myMap::X2 : 
      (k == 3 ? myMap::X3 : 
        myMap::INVALID))); } 

int K2int(myMap::key_type k) { return k; } 

當我初始化MYMAP的迭代器到地圖的結束,它失敗:

myMap m; 
myMap::iterator i = m.end(); //<= fails here 

有什麼辦法檢查我的構造函數迭代器是否指向地圖的末尾?如果是這樣如何?

+1

只有在引用'Iterator'時纔可以轉換。 – Jarod42

+2

在boost中檢出iterator_facade – sp2danny

+0

@ sp2danny我知道iterator_facade,但它不會解決我的問題。我的問題是不知道迭代器需要完成什麼接口,它更多的是我的迭代器類中的設計問題。 – Heyji

回答

1

簡短的回答是否定的。正如問題評論中的zett42所說,迭代器位置唯一已知的地方是在迭代器調用方。

爲了雖然解決了問題,因爲Jarod42建議,解決方案可以通過只計算等效鍵K提領該迭代時被找到:

Iterator(map_type::iterator & i): it(i) {}; 

value_type operator*() { 
    return { int2K(it->first), it->second}; 
} 

注:在以前的答案,我試着測試一個迭代器是否在它的容器的末尾,通過複製它,將拷貝增加1,並檢查拷貝是否仍然等於原始指針(指向結尾)。

但作爲zett42指出,這並不工作: - 遞增指向容器的最後一個迭代器應該是不確定的行爲 - 即使是一個簡單的指針資格作爲一個迭代器。在這種情況下,看到此解決方案無法正常工作是微不足道的。

/* DISCLAIMER: Not working ! */ 
Iterator(map_type::iterator & i) : it(i), K(INVALID) 
{ 
    map_type::iterator j = i; 
    j++; 
    if(i!=j) K = int2K(i->first); 
} 
+0

[不起作用](http://coliru.stacked-crooked.com/a/27b9c61bec8ecd55)。你甚至認爲這應該起作用?迭代器不需要持有關於容器的任何信息,即使是常規指針也可以作爲迭代器。 – zett42

+0

@ zett42:謝謝你的評論。我已經更新了答案,您可能還想更新您的評論(以及您的投票:-) – Heyji

相關問題