xon*_*n1c 4 c++ vector erase openframeworks
我正在尝试进行videoObjects存储在a中的Z-Index重新排序vector.计划是确定videoObject哪个将被放置在第一个位置vector,擦除它然后将其插入第一个位置.不幸的是,该erase()功能总是导致错误的内存访
这是我的代码:
testApp.h:
vector<videoObject> videoObjects;
vector<videoObject>::iterator itVid;
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
这应该是如此简单,但我只是没有看到我在哪里走错了路.
Pét*_*rök 15
你应该做
itVid = videoObjects.erase(itVid);
Run Code Online (Sandbox Code Playgroud)
来自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;
}
}
Run Code Online (Sandbox Code Playgroud)