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