c++ - 如何在 std::unique_ptr 的 std::vector 上使用remove_if?

标签 c++ stl unique-ptr

我正在尝试remove_if unique_ptr 的 vector 。由于忘记让我的 lambda 不尝试复制参数,我搜索了解释并在 Can you use `std::remove_if` on a container of `std::unique_ptr`? 中找到了它。 .

但是当我尝试按照此处和有关此事的其他问题中的建议通过引用或 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; });

我错过了什么?

最佳答案

What am I missing ?

它提示的是构造,而不是使用。

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());
}

See it on coliru

关于c++ - 如何在 std::unique_ptr 的 std::vector 上使用remove_if?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67605229/

相关文章:

C++ Windows 系统托盘不会显示消息

c++ - system() 命令不起作用 C++ linux

c++ - 在 C++ 中用字符串连接 const char * 的最干净的方法是什么?

C++ typedef 和子类化

c++11 - unique_ptr 向量的取消引用包装器?

c++ - 尝试访问库中成员的功能时出现段错误

c++ - 点击不起作用

c++ - 模板化成员函数不能从同一个类调用非模板化成员函数,C++

c++ - 何时为指向动态创建内存的静态指针创建内存?

c++ - std::unique_ptr 和指向指针的指针