11

次のコードを使用して、ベクトル ( として宣言vector<int> vectorX) のサイズが意図したものと異なる場合にエラーをスローします。

vector<int> vectorX;
int intendedSize = 10;
// Some stuff here
if((int)(vectorX.size()) != (intendedSize)) {
    cout << "\n Error! mismatch between vectorX "<<vectorX.size()<<" and intendedSize "<<intendedSize;
    exit(1);
}

coutステートメントは、両方の同じサイズを示しています。比較は、それらが等しいことを示していません

出力はError! mismatch between vectorX 10 and intendedSize 10

エラーはどこにありますか? 以前に試してみ(unsigned int)(intendedSize)ましたが、それも彼らが不平等であることを示していました.

4

3 に答える 3

26

受け入れられたものを含む他の2つは両方とも間違っているため、この回答を書いています。std::vectorのタイプはそうでsize()はありません。unsigned intsize_t

のサイズの型std::vector<T>は ですstd::vector<T>::size_type

それでおしまい。アーキテクチャやコンパイラによっては と同じかもしれませんが、size_tそうでない場合もあります。size_tタイプの変数がタイプの変数と同じ値を保持できるという仮定std::vector<T>::size_typeは失敗する可能性があります。

ベクトルが適切なサイズであることを確認するには、次のようにします。

if(vec.size() != static_cast<std::vector<int>::size_type>(expected_size)) {
    std::cerr << "Error!" << std::endl;
}
于 2015-02-14T09:52:31.707 に答える
9

)if ステートメントの右側に行方不明があります

if((int)(vectorX.size()) != (intendedSize)) {
                                          ^^^
}

ただし、std::vector::size の戻り値を int にキャストするのはよくないことに注意してください。サイズがどうなるかという可能性の半分を失います (chris のおかげです)。

あなたは書くべきです:

size_t intendedSize = 10; 
// OR unsign int intendedSize  = 10; 
if(vectorX.size() != intendedSize) {
}
于 2013-01-30T07:56:41.617 に答える
2

タイプを使用しsize_tてコレクションのサイズを保持します。

vector<int> vectorX;
size_t intendedSize = 10;
// Some stuff here
if(vectorX.size() != intendedSize) {
     ... 
}

実際には技術的に使用する必要がありますvector<int>::size_typeが、実際にはこれは常に typedef ですsize_t

Anintは通常、符号付き 32 ビット整数です。

size_t通常、符号なし 64 ビット整数 (64 ビット アーキテクチャの場合) または符号なし 32 ビット整数 (32 ビット アーキテクチャの場合) です。

(標準はこれらの制約を強制しないことに注意してください。ABI はこれを指定します。たとえば、x86 および x86-64 ABI はそうします。)

于 2013-01-30T08:07:00.833 に答える