使循环边界无效

时间:2010-08-10 18:56:23

标签: c++ loops conditional-statements erase bounds

我最近继承了一个主要用C ++完成的项目,所以这是我第一次接触它。我想知道我是否有问题从矢量begin()end()所限定的循环内删除矢量元素。

这是(基本上)我一直在努力做的事情:

for (vector<double>::iterator i = distance.begin(); i < distance.end(); i++) {
    for (vector<double>::iterator j = i + 1; j < distance.end(); j++) {

        /* code to assemble *i, *j, and some other values, say *x & *y 
        (also iterators) assumed to be in the distance vector */

        vector< vector<double >::iterator remove;
        remove.push_back(i); remove.push_back(j);
        remove.push_back(x); remove.push_back(y);

        sort(remove.begin(), remove.end());

        for (int r = remove.size() - 1; r >= 0; r--) {
            distance.erase(remove.at(r));
        }
    }
}

对于我正在测试的内容,这似乎有效。但是,我担心这只是因为侥幸而且不应该使用这种解决方案。 distance.end()是在每个循环开始时重置,还是C ++只检查初始值?

2 个答案:

答案 0 :(得分:1)

for-loop将在每个循环上评估i < distance.end()。问题出在distance.erase,它会使i无效,因此i++的结果未定义。

答案 1 :(得分:0)

distance.end()始终精确到向量的当前状态。

for()循环总是在每个循环上重新评估条件。