Vector.erase(Iterator)导致错误的内存访问

时间:2010-05-31 13:43:58

标签: c++ vector erase openframeworks

我正在尝试对存储在videoObjects中的vector进行Z-Index重新排序。计划是确定videoObject将放在vector的第一个位置,将其删除然后将其插入第一个位置。不幸的是,erase()函数总是导致错误的内存访问。

这是我的代码:

testApp.h:

vector<videoObject> videoObjects;
vector<videoObject>::iterator itVid;

testApp.cpp:

// Get the videoObject which relates to the user event
for(itVid = videoObjects.begin(); itVid != videoObjects.end(); ++itVid) {
  if(videoObjects.at(itVid - videoObjects.begin()).isInside(ofPoint(tcur.getX(), tcur.getY()))) {
   videoObjects.erase(itVid);
  }
}

这应该是如此简单,但我只是看不出我走错了路。

4 个答案:

答案 0 :(得分:15)

你应该做

itVid = videoObjects.erase(itVid);

引自cplusplus.com

  

[vector::erase]使所有迭代器和对 position first 之后的元素的引用无效。

     

返回值:一个随机访问迭代器,指向函数调用擦除的最后一个元素之后的元素的新位置,如果操作擦除了序列中的最后一个元素,则为向量结束。

更新:您访问条件中当前元素的方式看起来很奇怪。还必须避免在erase之后递增迭代器,因为这会跳过一个元素并可能导致越界错误。试试这个:

for(itVid = videoObjects.begin(); itVid != videoObjects.end(); ){
  if(itVid->isInside(ofPoint(tcur.getX(), tcur.getY()))){
    itVid = videoObjects.erase(itVid);
  } else {
    ++itVid;
  }
}

答案 1 :(得分:3)

注意,从向量中逐个擦除元素具有二次复杂性。 STL救援!

#include <algorithm>
#include <functional>

videoObjects.erase(
    std::remove_if(
        std::bind2nd(
            std::mem_fun_ref(&videoObject::isInside),
            ofPoint(tcur.getX(), tcur.getY())
        ),
    ),
    videoObjects.end()
);

答案 2 :(得分:1)

迭代列表时无法删除,因为迭代器无效。您应该使用Erase的返回迭代器将其设置为当前迭代器。

答案 3 :(得分:0)

erase函数返回下一个有效的迭代器。

您必须进行while循环并执行类似

的操作
iterator = erase(...)

进行相应的检查。