[英]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.