2016-08-22 16 views
3

私は私のC++プログラムは++ myvecstd::vector<float>の目的である警告:符号付きおよび符号なし整数の表現との間の比較は、[-Wsign-比較]

warning: comparison between signed and unsigned integer expressions [-Wsign-compare] 
     for (int i=0; i< myvec->size(); i++){ 
            ^

をGを使用してコンパイル。

std :: vectorの要素を反復処理するには、警告に対処する必要がありますか?ありがとう。

+3

可能な重複:

for(std::vector<float>::size_type i = 0; i < myvec->size(); i++) { //code here } 

別のアプローチは、イテレータを使用することですか?警告が表示されます:符号付きと符号なしの整数式の比較\ [-Wsign-compare \]](http://stackoverflow.com/questions/7984955/what-is-wrong-with-my-for-loops-i-getget -warnings-between-signed-and-u) –

+0

[署名済みと署名なしの比較のような警告をどのように修正できますか?](http://stackoverflow.com/questions/859943/how-can -i-fix-warnings-like-comparison-signed-and-unsigned) –

答えて

2

std::vector<T>::size()は、符号なし整数型のstd::vector<T>::size_typeを返します。あなたが署名されたものと符号なし整数を比較しているので、結果的にタイプint(すなわち、符号付き整数)である式i < myvec->size()iと比較

、あなたは当然警告を受けます。

この警告を受ける理由は、極値(最大値と最小値)で、符号なし整数が符号付きの整数よりも大きくなる可能性があるためです。コンパイラは、このために発生する可能性のある問題を考慮したかどうかを "尋ねる"/"警告"するために、警告を発行します。

これが問題でない場合は、単にキャストするだけで警告を修正できます。

for(int i(0); i < static_cast<int>(myvec->size()); ++i) { 
    ... 
} 

もう一つの方法は、myvec->size()のそれと一致するようにiの種類を変更するには、次のようになります。

for(std::vector<float>::size_type i(0); i < myvec->size(); ++i) { 
    ... 
} 

マインドしかし、あなたはループの中でそれを減少している場合iは、符号なし整数型になっていることをあなた予期しない結果が得られる可能性があります(つまり、負の値は得られません)。

もう一つの方法と、あなたのコンパイラは、C++ 11をサポートし、ベクター自体を変更せずに、あなたのベクトルの要素をループする場合は、範囲ベースのループを使用することですかのように:

for(auto &&e : *myvec) { 
    ... 
} 

マイベクトルの要素をループのための個人的な好みは、次のとおりです。Cで

for(int i(0), sz(myvec->size()); i <sz; ++i) { 
    ... 
} 
+0

ありがとうございます。私のコードはいくつかの潜在的な問題を引き起こしますか? – Tim

+0

@Timこれを行う正しい方法は 'iterators'または' size_type'を使用することです – KostasRim

+0

コンテナが非常に大きい場合は 'int'に注意しなければなりません。' int'がオーバーフローする可能性があります。 – Galik

2

vector ++インデックスに要素をsize_typeを使用しています。 あなたはこれでループのために書くことができますループの場合、私に[何が間違っているの

for(auto it = myvec->begin(); it != myvec->end(); ++it) { 
//code here 
} 
関連する問題