代码之家  ›  专栏  ›  技术社区  ›  nacho4d

迭代时删除[重复]

  •  13
  • nacho4d  · 技术社区  · 15 年前

    可能的重复:
    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 回复  |  直到 9 年前
        1
  •  36
  •   sth    12 年前

    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;
        }
    }
    
        2
  •  2
  •   David Titarenco    15 年前

    我不知道你得到了什么错误,但有可能你是无效的迭代器。

    http://www.angelikalanger.com/Conferences/Slides/CppInvalidIterators-DevConnections-2002.pdf

    明确地, vector::erase