2016-08-04 34 views
0

從對象指針向量中移除元素而不刪除它指向的對象的正確方法是什麼?C++:從對象指針向量中移除元素而不刪除它指向的對象的正確方法是什麼?

我想選擇性地從我的矢量

std::vector<Node*>openNodes; 

刪除元素,而不破壞其被指向到一個Node對象。 (這些節點在其他地方使用。)

我嘗試使用<算法>的的remove_if功能,像這樣

std::remove_if(openNodes.begin(),openNodes.end(),CheckClosedNode); 

使用自己的自定義比較函數

bool CheckClosedNode(Node *tocheck) 
{ 
    if(tocheck->isOpen) 
     return false; //Don't remove. Node is still open. 
    else 
    { 
     //std::cout << "node " << tocheck->id << " is being removed from open list..." << std::endl; 
     return true; // Remove. Node is closed. 
    } 
} 

然而,當我的std :: cout openNodes的內容,什麼都沒有被刪除。我讀到應該將std :: erase()與remove_if()一起使用,但erase()將刪除節點。我想將需要移除的所有元素移動到vector的前面並執行pop_front(),但是實際上pop_front也會被刪除。

有沒有一種標準的方法來刪除矢量中的元素而不刪除對象?

+3

你誤解了關於std :: vector :: erase的文檔。它銷燬了刪除的元素(在你的情況下指針),而不是它們指向的內容。 – Resurrection

回答

4

它實際上不會刪除節點,如果它們是指針。當你使用新的對象分配內存時,你需要刪除指針。現在,如果你已經聲明它爲vector<Node>這將是一個問題,因爲擦除必須調用Node上的解構器。但是,指針實際上就像一個int類型(因爲它只是一個內存地址)。當你從一個向量中移除它時,它指向的內存沒有任何反應。

相關問題