C++ 迭代时删除
可能的重复项:C++ 迭代时删除,c++,stl,C++,Stl,可能的重复项: 嗨, 我写了这篇文章,但在运行它时遇到了一些错误 for (vector< vector<Point> >::iterator track = tracks_.begin(); track != tracks_.end(); track++) { if (track->empty()) { // if track is empty, remove it tracks_.erase(track);
嗨, 我写了这篇文章,但在运行它时遇到了一些错误
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... ;(
}
}
for(vector::迭代器track=tracks\uu.begin();track!=tracks\uu.end();track++){
如果(track->empty()){//如果track为空,请将其删除
磁道擦除(磁道);
track++;//这样可以吗?
}否则{//如果有点,deque
track->erase(track->begin());//我的程序在一段时间后在此崩溃(
}
}
我有一个点向量向量(2个整数),我称之为轨迹(1个轨迹是1个点向量)
我想检查每个轨迹,如果它们包含点,则删除第一个轨迹,否则删除轨迹。是否正确
提前感谢。我不确定您会遇到什么错误,但很可能您正在使迭代器无效 你应该读书 具体地说,
vector::erase
会使所有迭代器和对位置后或第一个元素的引用无效。向量的erase()
会使现有迭代器无效,但它是一个新的迭代器,指向被删除元素之后的元素。此返回的迭代器可用于继续对向量进行迭代
您的循环可以这样写:
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;
}
}
vector::迭代器track=tracks.begin();
while(track!=tracks.end()){
如果(轨迹->空(){
//如果轨迹为空,请将其删除
磁道=磁道\擦除(磁道);
}
否则{
//如果有要点,德克
轨迹->擦除(轨迹->开始());
++轨道;
}
}
这种问题已经被问过很多次了。搜索“C++擦除迭代器”的第一个结果是,这也回答了这个问题。@nacho4d:没有直接关系,但看看二维结构的Boost MultiArray。它比'std::vector'类型更容易使用。@TheUndeadFish:如果这很简单,为什么不(简单地)投票以重复的形式结束这个问题呢???@nacho4d你应该命名一个函子(或创建名为的函数)ShiftIfNonEmpty
。有时候,如果你在命名你的东西之前再仔细考虑一下,你就会看到手术的费用。@sbi除非我错过了什么,否则我认为我还不能投票来结束我目前的声誉。所以我试着用评论来尽我所能。棒极了。健壮、简单,不需要自己做评论委托等。这是一种非常常见的模式,如果在std中看到类似的内容会很好。第二个“deque”erase
做什么?迭代器“track”甚至没有erase/begin方法?如果没有它,则无法编译该方法,并且运行良好。@lama12345这直接来自问题中的代码,因为OP使用向量向量。OP只是想这样做,如果!track->empty()
,它与“迭代时删除”问题没有直接关系。