說我有一個地圖,其中的關鍵是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
有什麼辦法檢查我的構造函數迭代器是否指向地圖的末尾?如果是這樣如何?
只有在引用'Iterator'時纔可以轉換。 – Jarod42
在boost中檢出iterator_facade – sp2danny
@ sp2danny我知道iterator_facade,但它不會解決我的問題。我的問題是不知道迭代器需要完成什麼接口,它更多的是我的迭代器類中的設計問題。 – Heyji