2015-02-23 51 views
0

根據該螺紋Returning a pointer to a vector element,建議使用插入時到載體中的對象,並返回它的指針以下代碼:卸下自std元素::性病的目錄:: unique_pointer

// in your class 
std::vector<std::unique_ptr<SceneGraphNode>> m_children; 

SceneGraphNode* addChild(std::string name) 
{ 
    std::unique_ptr<SceneGraphNode> child(new SceneGraphNode(this,name)); 
    myList.push_back(std::move(child)); 
    return myList.back().get(); 
} 

我打算使用相同的代碼,但使用std::list。我沒有重新分配的問題,但std::unique_ptr仍然有助於破壞矢量 - 而不是簡單的delete

問題:如何使用列表的remove與此設置?使用普通指針,我可以只寫myList.remove(myPtr),其中myPtr是一個指向要移除的對象的普通指針。

+1

請注意,即使使用'std :: vector'重新分配調整大小的東西,它通常仍然比'std :: list'快得多(儘管這裏並沒有真正的數據局部性,的std :: unique_ptr's)。 – rubenvb 2015-02-23 09:13:21

+0

@rubenvb通過不必執行兩個指針取消引用來訪問元素,您仍然可以獲得額外的數據局部性。取決於應用程序,減少大量的解除引用可能會產生重大影響。 – sjdowling 2015-02-23 09:20:14

回答

2

如果myPtrunique_ptr,您仍然可以做myList.remove(myPtr)。這是因爲operator==超載這樣的智能指針:http://en.cppreference.com/w/cpp/memory/unique_ptr/operator_cmp

+0

但是這需要我在調用remove方法之前建立第二個'unique_ptr'到'myPtr':'myList.remove(unique_ptr(myPtr))'。這不是問題嗎? – Michael 2015-02-23 08:14:21

+0

@Michael你只需要一個你想從列表中刪除的'unique_ptr'的引用。然後當'unique_ptr'與自身進行比較時'operator =='返回true。 – sjdowling 2015-02-23 09:24:22

0

可能是這樣,這將是有益的:

it = find(myList.begin(), myList.end(), name); 
if (it != myList.end()) 
{ 
    mylist.erase(it); 
} 
1

如果你真的想用一個普通的指針myPtr可以使用

myList.remove_if([myPtr](const std::unique_ptr<SceneGraphNode>& ptr){return ptr.get() == myPtr});