4

std コンテナーをカプセル化するクラスがあるとします。

class Stash
{
    list<int> Data;

public:
    list<int>::const_iterator GetAccess() const { return Data.begin(); }
};

これは、イテレータの形式でユーザーにデータを読ませる非常に便利な方法です。ただし、イテレータを と比較する以外の方法が見つかりませんcontainer.end()。だから、stdlibだけでそれを行うオプションがあるのか​​ 、それともイテレータクラスを自分で書く必要があるのか​​ を知りたい(can_advanceメソッドなど)。

関連する質問はこれかもしれませんがそれはイテレータが有効かどうかを尋ねます。それは前進できるかどうかではありません。後者に関する情報は見つかりませんでした。

4

3 に答える 3

4

これを行うことはできません。単一の反復子には、それが指しているシーケンスの最後にあるときに情報が含まれていません。

通常、これは範囲を提供するか ( と考えてください)、クラスにandメソッドをstd::make_pair(cont.begin(), cont.end())提供して効果的に範囲にすることで解決されます。begin()end()

于 2012-08-15T14:41:08.033 に答える
2

イテレータはペアで機能します。シーケンスの先頭を指すイテレータと、シーケンスの最後を指すイテレータです。そのため、すべてのコンテナーにbegin()メンバーend()関数があります。そのため、コンテナーが管理する一連の値を確認できます。

GetAccessの名前をtoに変更しbeginて を追加する方がはるかに慣用的endです。また、標準的なアルゴリズムをend()データに適用することも可能になります。

于 2012-08-15T15:16:02.417 に答える
0

あなたが求めているように見えるのは、「先読み」イテレータです。イテレータを「適応」させて先読みするクラスを作成できます。この場合、アダプタはコードの一歩先を行くだけです。

template<class FwdIter>
class lookahead_iterator
{
public:
    lookahead_iterator(const FwdIter& begin): cur_iter(begin), next_iter(++begin) {}
    operator FwdIter() const { return cur_iter; }
    lookahead_iterator<FwdIter>& operator ++() { cur_iter = next_iter++; return *this; }
    // Other methods as needed.
private:
    FwdIter cur_iter;
    FwdIter next_iter;
};

言うまでもなく、フォワードイテレータ以上のものが必要な場合、これははるかに複雑になります。

于 2012-08-16T01:24:16.437 に答える