簡體   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