繁体   English   中英

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

[英]Vector.erase(Iterator) causes bad memory access

我正在尝试对存储在vector中的videoObjects进行 Z-Index 重新排序。 计划是识别要放在vector的第一个 position 上的videoObject ,将其擦除,然后将其插入到第一个 position。 不幸的是, erase() function 总是导致错误的 memory 访问。

这是我的代码:

测试应用程序.h:

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

测试应用程序.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);
  }
}

这应该很简单,但我只是不知道我在哪里走错了路。

你应该做

itVid = videoObjects.erase(itVid);

来自cplusplus.com的报价:

[ vector::erase ]使所有迭代器和位置第一个之后的元素引用无效。

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

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

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

注意,从矢量中逐个擦除元素具有二次复杂性。 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()
);

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

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

你必须做一个while循环并做类似的事情

iterator = erase(...)

有相应的检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM