【发布时间】: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 除非我错过了什么,否则我相信我还不能以我目前的声誉投票结束。所以我试图通过评论贡献我能做的。