6

関数 .size() を C++ のベクトルで使用すると、警告が表示されます サンプル コードは次のとおりです。

vector<classname*> object;
object.push_back(new classname2);

for(int i=0;i<object.size();i++){
....}

私は警告を受け取ります:

警告 C4018: '<': 符号付き/符号なしの不一致

最終的なコードでエラーや警告を表示することは許可されていないため、これを取り除く/別の方法を見つける必要があります。どうすればこれを取り除くことができますか?

4

3 に答える 3

7

問題は、符号付きと符号なしの比較を処理するときに発生する可能性がある潜在的な (重大な) 問題があることです。符号付きが 4 バイトである 32 ビット マシンを使用している場合int、ベクトルのサイズがその型で表現可能な最大量を超える可能性があります。それが発生すると、符号付きオーバーフローが発生し、結果として未定義の動作が発生します。

使用できるいくつかの代替手段を次に示します。

vector<T>::size_type:

for (std::vector<classname>::size_type i = 0; i < object.size(); ++i);

が返す型であるため、これは正しいことが保証されていsizeます。

イテレータ

std::vector<classname>::iterator it;

for (it = object.begin(); it != object.end(); ++it);

C++11:範囲ベースの:

for (auto& a : object)
{
     // ...
}

std::size_t:

for (std::size_t i = 0; i < object.size(); ++i);

doomster がコメントで述べたようにstd::size_t、基盤となるプラットフォームのビットサイズを持つ可能性があります。

unsigned int:

for (unsigned int i = 0; i < object.size(); ++i);

注: これを使用することで、 がsize32 ビット整数を返すと想定しています。通常、これは問題ではありませんが、確信が持てません。可能であれば、上記のいずれかを使用してください。

コードに関するもう 1 つのヒントは、メモリ管理を容易にするためにunique_ptr/のベクトルを使用することです。shared_ptr

std::vector<std::unique_ptr<classname>> object;
于 2013-05-05T17:53:36.490 に答える
-1

符号なし反復子を使用します。

for (unsigned int i = 0; i < object.size(); i++)
{

}
于 2013-05-05T17:30:29.077 に答える