C++:更改while循环迭代器的值安全吗



#include <iostream>
using namespace std;
int main() {
int x = 10;
while (x>0) {
x = x-1;
cout << x << "n";
}
return 0;
}

在这个简单的程序中,我更改while循环的迭代器的值。但是这样做安全吗?程序有时会遇到分段故障吗?

这个伪代码怎么样:

vector <vector<Struct> > all_vectors;
vector<Struct> old_vector, new_vector;
Initialize old_vector;
all_vectors.push_back(old_vector);
index = 0;
while (all_vectors[index].size()>0) {
calculate new_vector;
if (new_vector not empty) all_vectors.push_back(new_vector);
index += 1;
}

我的真实代码有点混乱和冗长,所以我只发布了我真实代码的主要思想。但对于这种情况,我遇到了分割错误。当我尝试调试时,问题似乎出现在以下行:index+=1。我不明白为什么。如果我的代码不可读,我很抱歉,我只是在学习C++。

我现在猜,但如果您的循环看起来像您提供的第二个示例,那么分段错误可能是由while语句中的检查引起的。

...
index = 0;
while (all_vectors[index].size() > 0) {
^-- This, this could be the problem
...
index += 1;
}

原因是程序试图访问超出范围的矢量。这可能会解决的问题

...
while (index < all_vectors.size() && all_vectors[index].size() > 0) {
^---- Check this index first  ^---- only checked if first condition is true
...

从外观上看,我建议使用for循环:

...
for (size_t index = 0; index < all_vectors.size() && all_vectors[index].size() > 0; ++i) {
...

当矢量出现分割错误时,我也可以建议使用.at((而不是operator[],因为这可以进行范围检查,可以帮助您更快地找到问题。

您想要询问更改循环变量(x(的值是否安全。记住,迭代器是指向容器内元素的对象(类似于指针(,因此整数变量int x不是迭代器。

现在,您的问题的答案是在循环体中更改循环变量的值是完全安全的。如果不更改循环变量的值,则不能期望循环终止!

进入第二部分,不合逻辑地更改值将导致无限循环或分割错误。假设您在循环体中写入了x=x+1而不是x=x-1,在这种情况下,x的值将始终大于0,因此循环永远不会终止。

为了前进(在典型情况下(,更改输入迭代器的值是固有的必要条件。如果您不更改用作结束条件的迭代器,那么除非迭代从末尾开始,否则您永远不会到达迭代的末尾,即没有迭代。

注意,迭代器与循环变量的概念不同,但答案同样适用于循环变量。

最新更新