gpt4 book ai didi

c++ - 从带有原始指针的 vector 中删除 std::unique_ptr 的最佳方法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:35:03 28 4
gpt4 key购买 nike

所以我有一个像这样的 vector :

std::vector<std::unique_ptr<SomeClass>> myVector;

然后我有另一个 vector ,其中包含 SomeClass 的原始指针:

std::vector<SomeClass*> myOtherVector;

如果 myOtherVector 中有一个元素,它也会在 myVector 中,所以我想遍历 myOtherVector 中的每个元素并删除来自 myVector 的相同元素。然后清除 vector 。这是我想出的:

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 引用同一个对象。 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 已触发断点”。单击继续后,出现调试断言失败。

很明显我做错了什么,但我不知道是什么。使用原始指针从 vector 中删除智能指针的正确方法是什么?

最佳答案

这就是我要做的。性能可以提高,但只要它不会成为您的应用程序的瓶颈,我就不会为此烦恼。算法简单明了。

它使用remove_if 有选择地从第一个容器(myVector)中删除所有指向第二个容器(myOtherVector)元素指向的对象的元素;然后,它清除第二个容器。谓词是通过 lambda 函数实现的:

#include <vector>
#include <memory>
#include <algorithm>

struct SomeClass { /* ... */ };

int main()
{
std::vector<std::unique_ptr<SomeClass>> myVector;
std::vector<SomeClass*> myOtherVector;

myVector.erase(
std::remove_if( // Selectively remove elements in the second vector...
myVector.begin(),
myVector.end(),
[&] (std::unique_ptr<SomeClass> const& p)
{ // This predicate checks whether the element is contained
// in the second vector of pointers to be removed...
return std::find(
myOtherVector.cbegin(),
myOtherVector.cend(),
p.get()
) != myOtherVector.end();
}),
myVector.end()
);

myOtherVector.clear();
}

关于c++ - 从带有原始指针的 vector 中删除 std::unique_ptr 的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15125631/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com