カスタムイテレータとconst_iteratorを正しく実装するにはどうすればいいですか? 質問する

カスタムイテレータとconst_iteratorを正しく実装するにはどうすればいいですか? 質問する

カスタム コンテナー クラスがあり、それに対して クラスiteratorconst_iteratorクラスを記述したいと考えています。

これまでこれをやったことがなく、適切な方法を見つけることができませんでした。イテレータの作成に関するガイドラインは何ですか、また何に注意する必要がありますか?

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

脚注: Boost にはこれを緩和する機能があると確信していますが、さまざまな愚かな理由により、ここでは使用できません。

ベストアンサー1

  • コンテナーに適したイテレータのタイプ (入力、出力、転送など) を選択します。
  • 標準ライブラリの基本イテレータクラスを使用します。たとえば、std::iteratorこれらの基本クラスは、random_access_iterator_tagSTL に必要なすべての型定義を定義し、その他の作業を行います。
  • コードの重複を避けるには、イテレータ クラスをテンプレート クラスにして、「値型」、「ポインタ型」、「参照型」、またはそれらすべて (実装によって異なります) でパラメーター化する必要があります。例:

    // 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型定義: これらは、非 const および const イテレータの型です。

参照:標準ライブラリリファレンス

編集: std::iterator C++17以降は非推奨です。関連する議論を参照してください。ここ

おすすめ記事