所以我有一个像这样的向量:
std::vector<std::unique_ptr<SomeClass>> myVector;
然后我有另一个包含原始指针的向量SomeClass
:
std::vector<SomeClass*> myOtherVector;
如果里面有一个元素,myOtherVector
它也会在里面myVector
,所以我想遍历每个元素myOtherVector
并从中删除相同的元素myVector
。然后清除向量。这就是我想出的:
for(size_t i = 0; i < myOtherVector.size(); i++)
{
myVector.erase(std::remove(myVector.begin(), myVector.end(), myOtherVector[i]), myVector.end());
}
myOtherVector.clear();
这会产生编译时错误,因为myVector
拥有唯一的指针,但我给remove()
函数一个原始指针。这是我需要帮助的地方,因为我不知道解决这个问题的正确方法是什么。我将行更改为:
myVector.erase(std::remove(myVector.begin(), myVector.end(), std::unique_ptr<SomeClass>(myOtherVector[i])), myVector.end());
首先这是不正确的,因为现在我有两个std::unique_ptr
s 引用同一个对象。里面的元素myVector
包含一个引用,上面一行中唯一指针的构造是另一个引用。而且我什至不知道构造一个新的指针来获得相同的类型在概念上是否是正确的方法。因此,我将唯一指针更改为共享指针:
std::vector<std::shared_ptr<SomeClass>> myVector;
std::vector<SomeClass*> myOtherVector;
for(size_t i = 0; i < myOtherVector.size(); i++)
{
myVector.erase(std::remove(myVector.begin(), myVector.end(), std::shared_ptr<SomeClass>(myOtherVector[i])), myVector.end());
}
myOtherVector.clear();
当我运行应用程序时,该myVector.erase()
行导致运行时错误,显示“ApplicationName.exe 已触发断点”。单击继续后,我得到了调试断言失败。
所以很明显我做错了什么,但我不知道是什么。使用原始指针从向量中擦除智能指针的正确方法是什么?