1. ホーム
  2. c++

[解決済み】カスタムイテレータとconst_iteratorを正しく実装する方法は?

2022-03-31 18:13:31

質問

カスタム・コンテナ・クラスがあり、そのコンテナ・クラスに対して iteratorconst_iterator クラスがあります。

私はこれをやったことがなく、適切なハウツーを見つけることができませんでした。イテレータの生成に関するガイドラインや、注意すべき点は何ですか?

また、コードの重複を避けたい(と感じるのは const_iteratoriterator は多くのものを共有しています。一方は他方をサブクラス化すべきでしょうか?)

脚注:Boostにはこれを容易にするものがあるはずだが、多くのくだらない理由のため、ここでは使えない。

解決方法は?

  • コンテナに合ったイテレータのタイプを選択します:入力、出力、フォワードなど。
  • 標準ライブラリの基本イテレータクラスを使用します。例えば std::iterator random_access_iterator_tag .これらの基底クラスは、STLで必要とされるすべての型定義を定義し、その他の作業を行います。
  • コードの重複を避けるため、イテレータクラスはテンプレートクラスとし、"値型", "ポインタ型", "参照型" またはそれらすべて(実装による)をパラメータとすることが必要です。例えば

    // iterator class is parametrized by pointer type
    template <typename PointerType> class MyIterator {
        // iterator class definition goes here
    };
    
    typedef MyIterator<int*> iterator_type;
    typedef MyIterator<const int*> const_iterator_type;
    
    

    お知らせ iterator_typeconst_iterator_type の型定義は、non-const および const イテレータの型です。

こちらもご覧ください。 標準ライブラリリファレンス

EDITです。 std::iterator は C++17 から非推奨となりました。 関連する議論を参照してください。 こちら .