2017-07-18 26 views
0

std::vector<Foo>(またはランダムアクセス反復子を持つすべてのコンテナ)をループすると、符号なし整数変数iが使用されます。規範を尊重したい場合は、std::size_tか、コンテナ自体が指定した型を使用する必要がありますか:std::vector<Foo>::size_typestd :: size_tまたはstd :: vector <Foo> :: size_type?

私は(読みやすさの理由のために)std::size_tを選択した場合、私はstd名前空間内のすべてのコンテナのすべての実装がsize_typeとしてstd::size_t使用していることを確認することができますか?

注:互換性の理由から、私はC++ 98のみを使用します。

+1

いいえ、わからないです。狭い変換を避けたい場合は、コンテナが提供するタイプを使用してください。 – StoryTeller

+0

あなたが持つことができる楽しいことは 'size_t'が' unsigned long'のtypedefであり、 'std :: vector :: size_type'が64ビットLinuxマシンで' unsigned long long'になることです。両方とも64ビット幅で、同じ範囲を持ちますが、同じタイプではありません。 (例:http://coliru.stacked-crooked.com/a/06c88c51b0cf219b) – NathanOliver

+0

テンプレートクラスは、 '' std :: size_t''と ' 'std :: vector :: size_type''は同じサイズです(私は今実装しようとすることはできませんが、それは実行可能であると確信しています)。 – nefas

答えて

3

必ずしもstd::vector<Foo>::size_typestd::size_tと同じです。これはC++ 11でも当てはまります。

私はstd::vectorのインデックスに個人的にはstd::size_tを使用しています。

特に勤勉な気持ちであれば、いつでも静的アサーションを使用できます。明らかにstatic_assertはC++ 98には何があるかを超えた後に追加されたが、その標準にあなたはタイプの種類が同じサイズでない場合は、コンパイル時の障害を誘発する

static char wrong_size_1[1 + sizeof(std::size_t) - sizeof(std::vector<Foo>::size_type)]; 

static char wrong_size_2[1 - sizeof(std::size_t) + sizeof(std::vector<Foo>::size_type)]; 

のようなものを使用することができます。

+0

実際に、私はすでにブーストでスタティックアサートを使用しています。良いアイデア ! – Caduchon

+0

うわー。 BoostはまだC++ 98をサポートしています!彼らは良い卵です。 – Bathsheba

+0

私はGCC 4.4.7で何も(既知の)問題なしでboost 1.57を使用します。 ;-) – Caduchon

1

私は、std名前空間内のすべてのコンテナのすべての実装でstd::size_tsize_typeとして使用することができますか?

いいえ、できません。

size_tは、(アレイを含む)任意の型の理論的に可能オブジェクトの最大サイズを保存することができますので、しかし実際には、あなたはstd::size_tは、単一のアレイに基づくベクターまたは他の容器のために十分な大きさであることを信頼することができます。

+0

オブジェクトの最大サイズは、ベクトルの最大 'size_type'よりもずっと大きいかもしれません。 'std :: vector <> :: type'の範囲は、' T'がベクトルに保持されているときは0から 'numeric_limits :: max()/ sizeof(T)'です。心配は私が言っている可能性のある狭い変換です。 – StoryTeller

+0

@StoryTellerあなたの整数がベクトルのオブジェクトをインデックスするには小さすぎるかどうか心配です。 'std :: size_t'は少なくとも必要な大きさなので、任意のインデックスを表すことができます。最悪の場合、それはわずかなメモリを浪費します。 – user2079303

+1

小さすぎると到達不能な要素があります。それが大きすぎると、あなたは間違った場所にある要素を修正し、おそらくは変更します。私は、他のものよりも捕まえるのが簡単なバグだと思う。狭い転換は少し悪いです。 – StoryTeller

関連する問題