我最近继承了一个主要用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 ++只检查初始值?
答案 0 :(得分:1)
for-loop将在每个循环上评估i < distance.end()
。问题出在distance.erase
,它会使i
无效,因此i++
的结果未定义。
答案 1 :(得分:0)
distance.end()
始终精确到向量的当前状态。
for()
循环总是在每个循环上重新评估条件。