2013-03-02 7 views
9

負のインデックスを使用してvectorのインデックスを作成しようとしました。 vector::at()メンバー関数は、指定されたインデックスがベクターの境界内にあるかどうかをチェックし、それが発生しない場合は、out_of_range例外がスローされます。負のインデックスを持つstd :: vectorをインデックスする

vector<float> array; // sample vector 
array.push_back(0.123); 
array.push_back(1.234); 
array.push_back(2.345); 
array.push_back(3.456); 
array.push_back(4.567); 

int index = -1; 
float f = array.at(index); 
cout << f << endl; 

vector::at()メンバ関数のシグネチャは、指定されたパラメータがvector<T>::size_type型であり、このタイプのベクターのためunsigned intので、コンパイラはintから暗黙の変換(index変数の型)を行うべきであることを必要としますunsigned intindex値は上記の例で-1あるため、暗黙index変換(すなわちunsigned intタイプの最大値である)4294967295ある:この値は、out_of_range例外をスローvector::at()メンバ関数に渡されます。 vector::at()メンバ関数がindexがゼロ未満である、むしろ暗黙変換indexvectorの現在の大きさよりも大きいのでことを認識するのですなわち

は、この例外がスローされていません。これは正しい説明ですか?

+0

はい、基本的に – Dave

+0

はい、それは正しい説明です。 – syam

答えて

8

はい、正しい説明です。 (atvector::size_typeで、通常はstd::size_tで、システム上のポインタのビット幅は不定ですが、システムではunsigned intですが、標準では必須ではありません; 32ビットunsigned int 。64ビットsize_tが一般的である)として

さておき、符号付き変換する符号なしには注意してください:標準は、それが起こって往復することを必要としないsigned-> unsigned->負の値、およびいくつかのコンパイラのために署名積極的に予期しない方法で最適化します。

+0

標準で負の値の逆数を必要としないという意味はどうですか? – enzom83

+4

'(int)(符号なし)-1 == -1'は真である必要はありません。 – Yakk

+0

"いくつかのコンパイラは予期しない方法で積極的に最適化" - この変換は*実装定義*なので、最適化の驚きはないはずです –

関連する問題