【问题标题】:deleting while iterating [duplicate]迭代时删除[重复]
【发布时间】:2011-04-23 12:22:03
【问题描述】:

可能的重复:
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 个点向量) 我想检查每个轨道,如果它们包含点,则删除第一个,否则删除轨道。这是正确的吗?

提前致谢。

【问题讨论】:

  • 这种问题已经被问过很多次了。搜索“C++ 擦除迭代器”的第一个结果是stackoverflow.com/questions/2943912/…,它也回答了这个问题。
  • @nacho4d:没有直接关系,但可以看看 Boost MultiArray 的二维结构。它比 `std::vector<:vector> >` 类型更容易使用。
  • @TheUndeadFish:如果这很简单,你为什么不(简单地)投票结束这个问题是重复的??
  • @nacho4d 你应该命名一个仿函数(或创建一个命名的函数)ShiftIfNonEmpty。有时,如果您在命名您的事物之前进一步考虑,您会看到操作的成本。
  • @sbi 除非我错过了什么,否则我相信我还不能以我目前的声誉投票结束。所以我试图通过评论贡献我能做的。

标签: c++ stl


【解决方案1】:

向量的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;
    }
}

【讨论】:

  • 太棒了。强大,简单,不需要我自己的委托等。
  • 这是一个足够常见的模式,如果在标准中看到这样的东西会很高兴。
  • 第二个“deque”erase 做什么?迭代器“track”甚至没有擦除/开始方法?无法编译它并且没有它也能很好地工作。
  • @lama12345 这直接来自问题中的代码并且有效,因为 OP 使用向量的向量。 OP 只是想这样做,如果 !track-&gt;empty(),它与“迭代时删除”问题没有直接关系。
【解决方案2】:

我不确定您遇到了什么错误,但很有可能您正在使迭代器无效。

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

具体来说,vector::erase 使所有迭代器和对 position 或 first 之后的元素的引用无效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-31
    • 2013-01-23
    • 2010-11-09
    • 2014-07-12
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    相关资源
    最近更新 更多