警告:有符号和无符号整数表达式之间的比较 [-Wsign-compare]

Tim*_*Tim 5 c++ stdvector

当我使用 g++ 编译 C++ 程序时

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

其中myvec是 的对象std::vector<float>

为了迭代 std::vector 中的元素,我需要处理警告吗?谢谢。

101*_*010 3

std::vector<T>::size()返回std::vector<T>::size_type无符号整数类型。

因此,与类型(即有符号整数)的iin expression进行比较,您理所当然地会收到警告,因为您正在将无符号整数与有符号整数进行比较。i < myvec->size()int

您收到此警告的原因是,在极值(即最大值和最小值)处,无符号整数可能会比有符号整数更大。编译器会发出警告,以便“询问”/“警告”您是否考虑了因此可能出现的任何问题。

如果这对您来说不是问题,您可以通过简单的转换来修改警告。

for(int i(0); i < static_cast<int>(myvec->size()); ++i) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是更改​​ 的类型i以匹配 的类型myvec->size()

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

但请注意,这i将成为无符号整数类型,如果您在循环中减少它,您可能会得到意想不到的结果(即,它不会得到负值)。

另一种方法是,如果您的编译器支持 C++11,并且您想在不更改向量本身的情况下循环向量的元素,则可以使用基于范围的循环,如下所示:

for(auto &&e : *myvec) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

我个人最喜欢循环向量的元素是:

for(int i(0), sz(myvec->size()); i <sz; ++i) {
  ...
}
Run Code Online (Sandbox Code Playgroud)