我扩大与自定义的容器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之外,我可以通过任何方式将多个参数传递给我的迭代器吗?谢谢。
这有点奇怪。 MyContainer看起来既是一个容器又是一个迭代器。 – 2012-04-20 04:23:31
我知道:)因为我不想让代码直接修改地图的元素,所以我编写了一个包装来控制它,而他们试图通过operator [],operator ++等来访问地图数据。我是要继承std :: map来这样做,但似乎不建议这样做是因为虚拟析构函数。无论如何,这是我能想到的将接口保持为贴图并添加一些控件的唯一方法。 –
user1285419
2012-04-20 04:32:27
你想要一个常量图不提供什么? – 2012-04-20 04:41:09