簡體   English   中英

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

[英]C++: What is the proper way to remove elements from a vector of object pointers without deleting the object it points to?

從對象指針向量中刪除元素而不刪除其指向的對象的正確方法是什么?

我正在嘗試有選擇地從向量中刪除元素

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()結合使用,但是delete()將刪除節點。 我想到將所有需要刪除的元素移到向量的前面,並執行pop_front(),但事實證明pop_front也會刪除。

是否有一種標准方法可以從向量中刪除元素而不刪除對象?

實際上,如果它們是指針,則不會刪除節點。 使用new為對象分配內存時,刪除指針是您的工作。 現在,如果您像vector<Node>一樣聲明了它,這將是一個問題,因為擦除必須在Node上調用解構函數。 但是,指針實際上就像一個int類型(因為它只是一個內存地址)。 當您從向量中刪除它時,它所指向的內存沒有任何反應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM