我正在用自定义容器扩展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;
}
但是如果我将 iterator 更改为 const_iterator,它不会编译。我读了一些文章,其中提到要定义常量迭代器,我们只需将 value_type 从 X 替换为 X const,这就是我在代码中所做的。但我很快发现它在我的例子中可能不起作用,因为迭代器返回的引用在我的例子中是容器本身。我不知道如何在不重复编码的情况下使 const_iterator 工作。
此外,我的迭代器是从 std::iterator 派生的,但我发现我无法覆盖 我的迭代器的构造函数。除了 T *pt 之外,还有什么方法可以将多个参数传递到我的迭代器中吗?谢谢。
最佳答案
第一个问题:
如果你改变这个:
for (MyContainer::iterator it=h.begin(); !it.isEnd(); ++it)
到
for (MyContainer::const_iterator it=h.begin(); !it.isEnd(); ++it)
然后你从 begin()
和 end()
得到一个非常量 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
即不能用它来迭代!您可能需要重新考虑该设计。
关于c++ - 它无法从对应的迭代器中定义 const_iterator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10240117/