【发布时间】:2017-11-20 17:22:02
【问题描述】:
我有一个向量 foos 指向我的资源类型 Foo 的唯一指针。我想删除其中一些满足给定条件的内容。我该怎么做?
class Foo
{
public:
int some_num;
Foo(int some_num_) :some_num{ some_num_ }
{}
int getNum()
{
return some_num;
}
};
using FooPtr = std::unique_ptr<Foo>;
using Foos = std::vector<FooPtr>;
int main()
{
Foos foos;
foos.push_back(std::move(std::make_unique<Foo>(30)));
foos.push_back(std::move(std::make_unique<Foo>(35)));
std::vector<int> some_nums = { 35, 30, 25 };
for each (auto& num in some_nums)
{
foos.erase(std::remove_if(foos.begin(), foos.end(),
[&](auto foo) {return num == foo->getNum(); }), foos.end());
}
return 0;
}
看起来我正在复制unique_ptr,所以我收到以下错误,
'std::unique_ptr<Foo,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function
我应该怎么做?我不会使用该资源。我不关心超出这一点的所有权。
【问题讨论】:
-
s/
for each (auto& num in some_nums)/for(auto& num : some_nums) -
为什么要将
std::remove_if的返回值传递给std::vector::erase?根据documentation,返回值是“新值范围的结束迭代器”您真的是要删除此类迭代器指向的元素吗,此外到满足 lambda 的值? -
@user3222 在复制的 sn-p 状态中,你应该自己调用
erase?您刚刚复制了所述过程的描述。 -
@AlgirdasPreidžius 我确实提到“我想删除其中一些满足给定条件的文件”。所以,我应该从我的容器中删除这些元素,不是吗?
标签: c++ visual-c++ lambda unique-ptr erase-remove-idiom