我正在尝试对存储在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);
}
}
这应该是如此简单,但我只是看不出我走错了路。
答案 0 :(得分:15)
你应该做
itVid = videoObjects.erase(itVid);
[
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(...)
进行相应的检查。