迭代时删除

时间:2010-10-10 17:35:15

标签: c++ stl

  

可能重复:
  Vector.erase(Iterator) causes bad memory access
  iterate vector, remove certain items as I go.

您好, 我写了这个,但运行时我遇到了一些错误

for (vector< vector<Point> >::iterator track = tracks_.begin(); track != tracks_.end(); track++) {
        if (track->empty()) { // if track is empty, remove it
            tracks_.erase(track);
            track++; // is this ok?
        }else {   //if there are points, deque
            track->erase(track->begin()); //my program crashes here after a while... ;(
        }
    }

我有一个点矢量矢量(2个整数),我称之为轨迹(1个轨迹是1个点矢量) 我想检查每个轨道,如果它们包含点,则删除第一个轨道,否则删除轨道。这是对的吗?

提前致谢。

2 个答案:

答案 0 :(得分:34)

向量的erase()使现有的迭代器无效,但returns一个新的迭代器指向被移除的元素之后的元素。这个返回的迭代器可以用来继续迭代向量。

您的循环可以这样写:

vector< vector<Point> >::iterator track = tracks_.begin();
while (track != tracks_.end()) {
    if (track->empty()) {
        // if track is empty, remove it
        track = tracks_.erase(track);
    }
    else {
        //if there are points, deque
        track->erase(track->begin());
        ++track;
    }
}

答案 1 :(得分:2)

我不确定你会得到什么错误,但很可能你的迭代器无效。

您应该阅读http://www.angelikalanger.com/Conferences/Slides/CppInvalidIterators-DevConnections-2002.pdf

具体来说,vector::erase使所有迭代器和对位置或第一个之后元素的引用无效。