当我使用g ++
编译我的C ++程序时warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for ( int i=0; i< myvec->size(); i++ ){
^
其中myvec
是std::vector<float>
的对象。
为了迭代std :: vector中的元素,我是否需要处理警告?感谢。
答案 0 :(得分:2)
std::vector<T>::size()
返回std::vector<T>::size_type
,这是一个无符号整数类型。
因此,与i
类型i < myvec->size()
(即有符号整数)中的int
进行比较,您理所当然地收到警告,因为您正在将无符号整数与已签名的整数进行比较之一。
你得到这个警告的原因是,在它们的极值(即它们的最大值和最小值)下,无符号整数可能变得比它们的有符号整数更大。编译器会发出警告,以便“询问”/“警告”您是否考虑过因此而可能出现的任何问题。
如果这对你来说不是问题,你可以通过简单的方式修改警告。
for(int i(0); i < static_cast<int>(myvec->size()); ++i) {
...
}
另一种方法是更改i
的类型以匹配myvec->size()
的类型:
for(std::vector<float>::size_type i(0); i < myvec->size(); ++i) {
...
}
请注意i
变成无符号整数类型,如果你在循环中减少它,你可能会得到意想不到的结果(即,它不会得到负值)。
另一种方式,如果你的编译器支持C ++ 11,并且如果你想在不改变向量本身的情况下遍历向量的元素,那么将使用基于范围的循环:
for(auto &&e : *myvec) {
...
}
我个人最喜欢的循环元素是:
for(int i(0), sz(myvec->size()); i <sz; ++i) {
...
}
答案 1 :(得分:2)
Apple
使用vector
来索引元素。
您可以使用以下命令编写for循环:
size_type
另一种方法是使用迭代器:
for(std::vector<float>::size_type i = 0; i < myvec->size(); i++) {
//code here
}
答案 2 :(得分:0)
101010 already explained the reason 在比较有符号和无符号整数表达式时出现此警告。
尽管如此,我还是想提出另一种方法来解决此警告。对于size_t
,直接使用int
而不是i
。
for (size_t i = 0; i < myvec->size(); i++) {
// ...
}
在 stl_vector.h 中,size_type 是 size_t 的 type alias,所以我认为使用它应该是安全的,而不是像 101010 和 KostasRim 建议的那样写 std::vector<float>::size_type
,尽管那样更有表现力:-)
// [...]
typedef size_t size_type;
// [...]