size_t
とcontainer::size_type
に違いはありますか?
私が理解しているのは、size_t
はより一般的であり、どのsize_type
sにも使用できることです。
しかし、container::size_type
は特定の種類のコンテナ向けに最適化されていますか?
標準コンテナはsize_type
のtypedefとしてAllocator::size_type
(アロケータはテンプレートパラメータです)、std::allocator<T>::size_type
は通常はsize_t
(または互換性のあるタイプ)。したがって、標準的なケースでは、それらは同じです。
ただし、カスタムアロケーターを使用する場合、別の基本型を使用できます。そう container::size_type
は、最大限の一般性を得るために望ましい方法です。
size_t
は、オブジェクトのサイズに使用されるタイプとして定義され、プラットフォーム依存です。container::size_type
は、コンテナ内の要素数に使用されるタイプであり、container dependentです。すべてのstd
コンテナはsize_t
としてsize_type
を使用しますが、各独立ライブラリベンダーは、そのコンテナに適していると判断したタイプを選択します。
qt を見ると、Qtコンテナのsize_type
がバージョンに依存していることがわかります。 Qt3ではunsigned int
でしたが、Qt4ではint
に変更されました。
std::[w]string
の場合、std::[w]string::size_type
はstd::allocator<T>::size_type
と等しく、これはstd::size_t
と同じです。他のコンテナの場合、それは符号なし整数型で定義された実装です。
正確な型を使用すると便利な場合があります。たとえば、型をどこにラップするか(UINT_MAX
など)を知っているので、それを利用できます。または、2つの同一の型を関数/クラステンプレートに渡す必要があるテンプレートの場合。
とにかく簡潔にするためにsize_t
を使用していることがよくあります。一般的なコードでは、テンプレートが使用されるコンテナインスタンスとそれらのコンテナのサイズが一般にわからないため、コンテナサイズを格納する必要がある場合は、Container::size_type
typedefを使用する必要があります。