5

文字列を保持するクラスがあります。基本的に、クラスは文字列の配列に基づいて構築されます。

class stringlist {
public:
    typedef std::string str;
    void push(str);
    void pop();
    void print();
    void resize(size_t);
    size_t capacity();
    size_t size();
    stringlist() : N(15) {}
    stringlist(size_t sz) : N(sz) {}
    ~stringlist() { delete [] container; }
}
private:
    size_t N;
    str* container = new str[N];
};

演習の次の部分では、読者に次のことを求めます。

クラスの双方向イテレータを書く

本のこの時点では、オーバーロードされた演算子などについての話はありません。

のようなものがある場合str* iterator(*str)、インクリメント、デクリメントなどをどのように管理しますか。これらのメソッドに対して別の関数を記述できると想定していますが、iteratorそもそもデータ メンバーを記述する目的に反するようです。イテレータは別のクラスになりますか?

また、これらの関数を使用するためにイテレータにドットを付けることができるように、イテレータ内にインクリメント デクリメント関数を含めることは可能でしょうか?

4

2 に答える 2

7

ポインターは、有効な双方向反復子です。(これもランダムアクセスです)

したがって、クラスにイテレータサポートを追加できます

typedef str* iterator;
typedef const str* const_iterator;
iterator begin() { return container; }
const_iterator begin() const { return container; }
iterator end() { return begin() + size(); }
const_iterator end() const { return begin() + size(); }
const_iterator cbegin() const { return begin(); }
const_iterator cend() const { return end(); }

ただし、ポインタを使用して逆反復を実装することはできません (これは++、後方への移動と--前方への移動に使用されます)。しかし、標準ライブラリは素敵なアダプタを提供します (in #include <iterator>) :

typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
reverse_iterator rbegin() { return reverse_iterator(end()); }
reverse_iterator rend() { return reverse_iterator(begin()); }
const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
const_reverse_iterator crbegin() const { return rbegin(); }
const_reverse_iterator crend() const { return rend(); }
于 2013-11-06T16:10:52.130 に答える
0

通常、反復子は、反復するクラスのネストされたクラスとして実装されます。入れ子になったクラスのインクリメント演算子とデクリメント演算子をオーバーロードします。vector<int>::iterator it-は、実際には 内にネストiteratorされたクラスvector<int>です。

于 2013-11-06T16:07:34.340 に答える