当我使用 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 中的元素,我需要处理警告吗?谢谢。
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)
| 归档时间: |
|
| 查看次数: |
7322 次 |
| 最近记录: |