Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 迭代时删除_C++_Stl - Fatal编程技术网

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()
,它与“迭代时删除”问题没有直接关系。