2016-04-10 12 views
-2
template<class _Ty, 
    class _Alloc = allocator<_Ty> > 
    class vector 
     : public _Vector_alloc<_Vec_base_types<_Ty, _Alloc> > 
+0

具体的に説明します。 –

+0

私はSTLプログラミングの初心者です。 vector_allocとvector_base_typesがここでどのように使われているか知りたい。私はビジュアルスタジオを使用しています。2015 –

答えて

0

おそらくメモリ割り当てを処理する別のクラスを継承します。そのクラスにデータメンバーがない場合、vectorは空の基本最適化の恩恵を受けることができ、_Vector_allocはメモリを使用しません。

_Vector_alloc allocator;のようなデータを代わりに使用すると、そのデータメンバーは空であっても常に1バイトを取ることになります。これは、C++ではすべてのデータメンバーに個別のアドレスが必要であるためです。

イテレータ:std::vectorについて

、反復子は、基本的にポインタのラッパーであり、最も可能性の高い単一のデータメンバーとしてのポインタを含みます。 http://en.cppreference.com/w/cpp/iteratorで定義されているすべての制約を満たすために、追加のデータメンバーがあります。反復子は、(例えばstd::vector<T>::iterator::value_type = Tため)を有するべきである追加のメンバーは常にstd::iterator_traits<It>::value_typeを介してアクセスされているが

RandomAccessIteratorstd::vector::iteratorの場合)。 std::iterator_traits<T*>::value_type = TはSTLによって定義されているため、これにより、生ポインタもイテレータとして使用できます。したがって、ポインタは技術的には既に連続したメモリのイテレータです。

他のコンテナのイテレータは、より複雑です。たとえば、std:: unordered_map::iteratorでは、アイテムは異なるバケットにグループ化されています。イテレータは別のクラスであり、コンテナから派生したものではありません。これは内部クラス(クラスの名前空間で定義されている)であるため、コンテナのプライベートメンバーにアクセスでき、論理的にコンテナの一部です。

イテレータはconst-correctではありません。は、イテレータへのconstアクセスしか持たない場合でも、常に現在指しているアイテムに非constアクセスを与えます。各コンテナクラスには、2つのイテレータクラス、すなわちstd::vector::iteratorstd::vector::const_iteratorが含まれています。コンテナへのconstアクセスでは、それからconst_iteratorを得ることしかできません。

+0

イテレータの概念について少し説明できますか?彼らはどのようにここに収まりますか。彼らはどこで継承階層に入っていますか?私が知る限り、彼らはコンテナの要素へのポインタとして動作します。彼らはどのようにしてコンテナの要素を指すことができますか? –

関連する問題