警告:有符号和无符号整数表达式之间的比较[-Wsign compare] 当我用G++编译C++程序时 warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for ( int i=0; i< myvec->size(); i++ ){ ^ 警告:有符号和无符号整数表达式之间的比较[-Wsign compare] 对于(int i=0;isize();i++){ ^

警告:有符号和无符号整数表达式之间的比较[-Wsign compare] 当我用G++编译C++程序时 warning: comparison between signed and unsigned integer expressions [-Wsign-compare] for ( int i=0; i< myvec->size(); i++ ){ ^ 警告:有符号和无符号整数表达式之间的比较[-Wsign compare] 对于(int i=0;isize();i++){ ^,c++,stdvector,C++,Stdvector,其中myvec是std::vector的对象 对于在std::vector中迭代元素,我需要处理警告吗?谢谢。std::vector::size()返回无符号整数类型的std::vector::size\u type 因此,与表达式isize()中类型为int(即有符号整数)的i相比,您理所当然地会收到一条警告,因为您正在比较无符号整数和有符号整数 出现此警告的原因是,在其极值(即最大值和最小值)处,无符号整数可能会比有符号整数大。编译器会发出警告,以便“询问”/“警告”您是否考虑了由此可能出现

其中
myvec
std::vector
的对象

对于在std::vector中迭代元素,我需要处理警告吗?谢谢。

std::vector::size()
返回无符号整数类型的
std::vector::size\u type

因此,与表达式
isize()
中类型为
int
(即有符号整数)的
i
相比,您理所当然地会收到一条警告,因为您正在比较无符号整数和有符号整数

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

如果这对你来说不是问题,你可以通过简单的施法来修正警告

for(int i(0); i < static_cast<int>(myvec->size()); ++i) {
  ...
}
但是请注意,
i
将成为无符号整数类型,如果在循环中减少它,则可能会得到意外的结果(即不会得到负值)

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

for(auto &&e : *myvec) {
  ...
}
我个人最喜欢在向量元素上循环:

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

<代码> >(int i(0),sz(MyVEC -> siz());C++中的<< P> <代码>向量< /代码>使用<代码> siZeIZYPE类型< /C> >对元素进行索引。 您可以使用以下命令编写for循环:

for(std::vector<float>::size_type i = 0; i < myvec->size(); i++) {
//code here
}
比较有符号整数表达式和无符号整数表达式时出现此警告

然而,我想提出另一种解决此警告的方法,即直接使用
size\u t
而不是
int
来表示
I

for(size\u t i=0;isize();i++){
// ...
}
In size_type是size_t的缩写,因此我认为使用它应该是安全的,而不必像101010和KostasRim建议的那样编写
std::vector::size_type
,尽管这更具表现力:-)

/[…]
typedef size_t size_type;
// [...]

可能重复的@Tim可能重复的正确方法是使用
迭代器
size\u type
必须小心
int
如果容器非常大,
int
可能溢出。
for(std::vector<float>::size_type i = 0; i < myvec->size(); i++) {
//code here
}
for(auto it = myvec->begin(); it != myvec->end(); ++it) {
//code here
}