2016-07-17 9 views
2

私自身のコンテナを書いていますが、begin()end()の間にイテレータを作成してしまいがちです。コンテナのイテレータを構築する方法

std::vectorと同等ですが、boolには特化していないとしましょう。私がstd::vector<int>::iterator::と入力すると、intellisenseはコンストラクタを表示しません。彼らはbegin()end()でイテレータをどのように構築しますか?私はiteratorクラスがコンテナのメンバでなければならないと思います、間違っていますか?

私はコンストラクタがプライベートにされ、コンテナはイテレータの友人になると信じています。それにもかかわらず、私は何かが間違っていると思う。

答えて

2

std::vector<T>::iteratorは、 "iterator"という名前のstd::vector<T>クラスに何かがあることを意味します。

template<typename T> class vector { 

public: 

    typedef {{something}} iterator; 
}; 

:それはtypedefをすることができた(注:この質問の目的のために、私はAllocatorテンプレートパラメータを無視してよ、それは関連はありません)。

または、完全な内部クラスである可能性があります。

これは他にもいくつかあります。どのような場合でも問題ありません。あなたが保証するのは、std::vector<T>::iteratorを参照すると、イテレータの要件を満たすものが得られるということだけです。

コンテナの場合、コンテナのイテレータを自由に実装して、正しい結果を得ることができます。

ただし、カスタムイテレータのために、あなたは彼らがC++ライブラリとスムーズに相互運用できるようにしている場合std::iteratorは自動的に、すべてのイテレータを持っている必要がありますいくつかのことを宣言しますので、それは便利、properly inherit from std::iteratorにあなたのイテレータを持っています。

最後に、「実際にどのように構築されるのか」という限りでは、実際にはどのような方法でも構築できます。明示的にイテレータを構築しないでください。具体的には、begin()end()、またはfind()を使用するか、...イテレータをどのように構築する必要があるのか​​をコンテナだけが気にします。パブリックコンストラクタ、またはプライベートコンストラクタです。これはコンテナに完全に対応しています。

関連する問題