std::vector<int> tmp = ...
for(int i = 0; i <= tmp.size() - 3; i+=2){
std::cout << "i: " << i << " , tmp.size(): " << tmp.size() << std::endl;
if(tmp[i] == tmp[i+1]){
final.push_back(tmp[i] * 2);
}else{
final.push_back(tmp[i]);
final.push_back(tmp[i + 1]);
}
std::cout << "\ntmp.size() at the end of loop: " << tmp.size() << "\n";
}
Run Code Online (Sandbox Code Playgroud)
我有以下输出:
为什么循环执行i明显要大得多tmp.size()?
因为tmp.size()是1,从中减去3会产生负值.也就是说,减法会产生负值,如果它不是tmp.size()存在的size_t,那么它是无符号的.
当无符号在减法时即将变为负数时,它会"包裹"到一个非常大的值.这就是你的循环无法停止的原因.它还解释了编译器*产生的"签名到无符号比较"警告,它应该让你处于高度警戒状态.
要避免此问题,请将减法移至另一侧,并将其添加:
for (size_t i = 0 ; i+3 <= tmp.size() ; i += 2) {
...
}
Run Code Online (Sandbox Code Playgroud)
*如果您没有收到该警告,请更改编译器上的设置以警告您所有内容.这节省了大量时间用于调试编译器可以轻松检测到的许多常见问题.