web-dev-qa-db-ja.com

「size_t」と「container :: size_type」

size_tcontainer::size_typeに違いはありますか?

私が理解しているのは、size_tはより一般的であり、どのsize_typesにも使用できることです。

しかし、container::size_typeは特定の種類のコンテナ向けに最適化されていますか?

95
Charles Khunt

標準コンテナはsize_typeのtypedefとしてAllocator::size_type(アロケータはテンプレートパラメータです)、std::allocator<T>::size_type通常size_t(または互換性のあるタイプ)。したがって、標準的なケースでは、それらは同じです。

ただし、カスタムアロケーターを使用する場合、別の基本型を使用できます。そう container::size_typeは、最大限の一般性を得るために望ましい方法です。

96
Evan Teran
  • size_tは、オブジェクトのサイズに使用されるタイプとして定義され、プラットフォーム依存です。
  • container::size_typeは、コンテナ内の要素数に使用されるタイプであり、container dependentです。

すべてのstdコンテナはsize_tとしてsize_typeを使用しますが、各独立ライブラリベンダーは、そのコンテナに適していると判断したタイプを選択します。

qt を見ると、Qtコンテナのsize_typeがバージョンに依存していることがわかります。 Qt3ではunsigned intでしたが、Qt4ではintに変更されました。

38
TimW

std::[w]stringの場合、std::[w]string::size_typestd::allocator<T>::size_typeと等しく、これはstd::size_tと同じです。他のコンテナの場合、それは符号なし整数型で定義された実装です。

正確な型を使用すると便利な場合があります。たとえば、型をどこにラップするか(UINT_MAXなど)を知っているので、それを利用できます。または、2つの同一の型を関数/クラステンプレートに渡す必要があるテンプレートの場合。

とにかく簡潔にするためにsize_tを使用していることがよくあります。一般的なコードでは、テンプレートが使用されるコンテナインスタンスとそれらのコンテナのサイズが一般にわからないため、コンテナサイズを格納する必要がある場合は、Container::size_type typedefを使用する必要があります。