2017-01-06 2 views
4

はのは、できるだけ簡単な例を作ってみましょう:`size_t`は常に` vector <int> :: size_type`や他のコンテナ型のエイリアスですか?

製剤1:

std::vector<int> vec; 
// add 10E11 elements 
for(std::size_t n = 0; n < vec.size(); ++n) 
    // ... 

製剤2:

std::vector<int> vec; 
// add 10E11 elements 
for(std::vector<int>::size_type n = 0; n < vec.size(); ++n) 
    // ... 

当然のことながら、unsigned intまたは不適切なデータ型はここで働いていないとx64をコンパイルする必要があります。私の質問は次のとおりです。最初の処方が問題につながるケースはありますか?安全にはこの短い記法で書いていますか?彼らが(x86、他のコンテナ、size_typeの他のアプリケーション)をカバーするのが些細なのであれば、私は同様の設定で面白いだろう。

+1

イテレータと 'auto'を使用している場合は問題はありません...;-) – DevSolar

+1

インデックスカウントを追跡する必要がある場合や、ループ内の反復インデックスを変更する必要がある場合があります。 – IceFire

+0

一般的な定義では、理論的に可能な任意のタイプのオブジェクト(配列を含む) 。 – rcgldr

答えて

4

std::vectorvector::data返すためポインタは、そのシーケンス全体に対して有効イテレータであることを保証「[data(), data() + size())が有効な範囲であることをポインタように。」これはstd::ptrdiff_tを超えて定義されたポインタの追加です。これはstd::size_tの署名付きバージョンです。

また、[iterator.requirements.general]/6が適用されます。

...整数値nとdereferenceableイテレータはa(a + n)値、*(a + n)*(addressof(*a) + n)と同等です...

のためにそれが可能ですvector::size_typeであり、より狭いstd::size_tより大きく、例えば64ビットシステムでは32ビットである。しかし、それは私が心配するものではありません。

+0

標準は 'sizeof(std :: size_t)> = sizeof(std :: vector :: size_type)'の意味を明示しています。任意の 'T 'と任意のアロケータを使用します。したがって、' size_t'は常に安全に使用できますが、場合によってはメモリが不十分な場合もあります。 @IceFire Right。 – IceFire

+1

実際には、 'size_type'はアロケータ認識インタフェースとは無関係であり、アロケータに依存することは驚くべきことです。どのコンテナに対しても、少なくともmake_unsigned_t と同じくらい広いです。 – Potatoswatter

+0

...ええと、それほど驚くべきことではありません。キャッチすることは、スタンダードが空想的なポインタを制約しているということだけです。 – Potatoswatter

0

std::vector::size_typeは、通常std::size_tですが、必ずしも保証するものではありません。使用する方が安全です

for(std::vector<int>::size_type n = 0; n < vec.size(); ++n) 
3

すべての一般的な実装でありますが、これは標準では保証しません。保証されるのは、std::vector<T>::size_typeが実装定義の符号なし整数型であることです。

参考文献:[container.requirements.general]

X

23.2.1一般コンテナ要件:: size_type符号なし 整数型

及び23.3 [あります]。 6.1クラステンプレートベクトルの概要[vector.overview]§2

typedef implementation-defined size_type; // see 23.2 
関連する問題