0

我正在使用自定义容器扩展 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,它将无法编译。我读了一些文章,其中提到要定义常量迭代器,我们只需将 value_type 从 X 替换为 X const,这就是我在代码中所做的。但是我很快发现它在我的情况下可能不起作用,因为迭代器返回的引用在我的情况下是容器本身。我不知道如何在不重复编码的情况下使 const_iterator 工作。

此外,我的迭代器派生自 std::iterator 但我发现我无法覆盖我的迭代器的构造函数。除了 T *pt 之外,我可以通过任何方式将多个参数传递给我的迭代器吗?谢谢。

4

1 回答 1

1

第一个问题:

如果你改变这个:

for (MyContainer::iterator it=h.begin(); !it.isEnd(); ++it)

for (MyContainer::const_iterator it=h.begin(); !it.isEnd(); ++it)

然后你iteratorbegin()and得到一个非常量end()并尝试从中初始化 a const_iterator,但这是一个不同的类型,你的my_iterator模板没有允许从不同类型构造的构造函数。

您可以通过添加以下内容来解决此问题:

template<typename> friend class myiterator;

template<typename T2>
  myiterator(myiterator<T2> const& i) : pointer(i.pointer) { }

您还应该制作operator*const (它不会更改迭代器以取消引用它。)

但是还有一个更大的问题, aconst_iterator指向 a const MyContainer,但是const_iterator::operator++需要改变那个对象,它不能因为它是 const 。所以你不能增加你的const_iteratorie 不能用它来迭代!您可能需要重新考虑该设计。

于 2012-06-16T02:35:33.387 回答