0

Iterator クラスの実装中に ->() 演算子をオーバーロードするという問題に直面しました。この演算子はどのようにオーバーロードする必要がありますか?

class iterator
{
private:
    pair<Key_t, Val_t> p;

public:
    iterator()
    {

    }

    iterator(const iterator &i)
    {
        p = i.p;
    }

    iterator(Key_t key, Val_t v)
    {
        p = make_pair(key,v);
    }

    pair<const Key_t,Val_t>& operator *() const
    {
        return p;
    }

    iterator& operator = (const iterator &iter)
    {
        this->p = iter;
        return *this;
    }
};

この方法を試みたが失敗した

&(pair<const Key_t,Val_t>&) operator ->() const
    {
        return &(**this);
    }
4

1 に答える 1

0

このアプローチ全体が間違っているように見えます。

イテレータは値を含むべきではなく、少なくとも

  • コンテナ内の値を見つけるために必要な情報。
  • コンテナ内の次の要素にトラバースするために必要な情報。

イテレータ内に値を格納すると、不要なコピーが発生し、コンテナを更新できなくなります (値の変更、コンテナからの要素の削除など)。

たとえば、 のstd::vectorようなコンテナーの反復子は、コンテナーへのハンドルと現在のアイテムへのインデックス (オフセット) を格納する場合があります。

イテレーター自体が値を持つのは、実際にはコンテナーに関連付けられていないジェネレーターを実装している場合のみです。

于 2013-05-15T14:41:09.473 に答える