说我有一个地图,其中的关键是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