如何在std::unique_ptr的std::向量上使用remove_if



我正在尝试将remove_if作为unique_ptr的向量。由于忘记了让lambda不尝试复制参数,我搜索了解释,并在"std::unique_ptr"的容器上使用"std:::remove_if"中找到了它?。

但是,当我试图按照建议通过引用或const-ref传递lambda参数时,以及在其他问题中,我仍然得到'std::unique_ptr<int,std::default_delete<int>>::unique_ptr(const std::unique_ptr<int,std::default_delete<int>> &)': attempting to reference a deleted function。我不明白为什么要调用这个复制构造。

std::vector<std::unique_ptr<int>> v {
std::make_unique<int>(1),
std::make_unique<int>(2),
std::make_unique<int>(3)
};
auto result = std::remove_if(v.begin(), v.end(), [](const std::unique_ptr<int> &it) {return *it > 2; });

我错过了什么?

我缺少什么?

它抱怨的是结构,而不是使用。

std::initialiser_list只能从中复制,因此std::initialiser_list<std::unique_ptr<...>>是无用的。

#include <memory>
#include <vector>
#include <algorithm>
int main()
{
std::vector<std::unique_ptr<int>> v;
v.emplace_back(std::make_unique<int>(1));    
v.emplace_back(std::make_unique<int>(2));    
v.emplace_back(std::make_unique<int>(3));    

auto result = std::remove_if(v.begin(), v.end(), [](const std::unique_ptr<int> &it) {return *it > 2; });
v.erase(result, v.end());
}

在coliru 上查看

最新更新