「size_t」対「container :: size_type」


108

とに違いはsize_tありcontainer::size_typeますか?

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

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

回答:


108

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

ただし、カスタムアロケーターを使用する場合は、異なる基になる型を使用できます。したがってcontainer::size_type、一般性を最大化するために推奨されます。


2
この答えを明確にできますか?私は、はるか昔のようにドラフト規格に戻って見ているN1804と私は間の任意の関係が表示されないAllocator::size_typeとしますsize_type。libstdc ++を一目見ただけでも、これに似たものは何もありません。
Shafik Yaghmour、2015

1
@ShafikYaghmour、この回答は少し時代遅れですが、移植性を最大化するために、私はアドバイスはまだ健全だと思います:C ++ 03は「表32:size_type:割り当てモデルで最大のオブジェクトのサイズを表すことができる型」を指定しました。当時、size_tこれらの制約の実用的な実装が賭けられました。ただし、C ++ 11では、std::make_unsigned<X::difference_type>::typeデフォルトで次のように定義されています。実際には、おそらくと同じか互換性がありsize_tます。
エヴァンテラン2015

2
CARE答えは正しくありません。... stackoverflow.com/questions/4849678/…を参照してください。
user3063349

1
@ user3063349そのページにも、C ++ 2017 Standard(23.10.8)にも、size_type廃止予定を示唆するものは何もありません。何ができますか?
Marc.2377

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

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

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


1
何かのサイズをintとして表現するのは少し奇妙です。コンテナーのサイズが負になることはありますか?
Mihai Todor

10
@MihaiTodor:すべての人が符号付きの型を使用するのは珍しいことではありません。Qtも同様です。その理由は、混合演算(特に比較)は非常に危険な領域であるため、多くの人々は、数値の符号なし型の使用を避け、混合演算を処理または回避する必要があるからです。unsigned型は負の数を表現できないからといって、あなたが意味するものではありません持って否定することはできません数字のためにそれらを使用するように:-)私はそれがだ驚いて告白するintのではなくssize_tint小さなの一種です。
スティーブジェソップ2012

2
「すべてのstdコンテナは、size_tをsize_typeとして使用します」非常に誤っており、誤解を招くおそれがあります。はい、彼らは通常そうします(少なくとも私のコンパイラはすべてそのように行いました)が、C ++言語リファレンスには、すべてのstlコンテナで同様である必要があるとは記載されていません。so care
user3063349 '26 / 07/26


8

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.