2015-02-23 49 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});