カスタム コンテナー クラスがあり、それに対して クラスiterator
とconst_iterator
クラスを記述したいと考えています。
これまでこれをやったことがなく、適切な方法を見つけることができませんでした。イテレータの作成に関するガイドラインは何ですか、また何に注意する必要がありますか?
また、コードの重複も避けたいと思います (重複していると感じておりconst_iterator
、iterator
多くのものを共有しています。一方が他方をサブクラス化すべきでしょうか?)。
脚注: Boost にはこれを緩和する機能があると確信していますが、さまざまな愚かな理由により、ここでは使用できません。
ベストアンサー1
- コンテナーに適したイテレータのタイプ (入力、出力、転送など) を選択します。
- 標準ライブラリの基本イテレータクラスを使用します。たとえば、
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_type
とconst_iterator_type
型定義: これらは、非 const および const イテレータの型です。
編集: std::iterator
C++17以降は非推奨です。関連する議論を参照してください。ここ。