c++ - 如何将 std::find_if 与唯一指针 vector 一起使用?

标签 c++ algorithm unique-ptr

如何将 std::find_if 等算法与唯一指针 vector 一起使用?例如:

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

class Integer {
public:
    explicit Integer(int i): i_(i){};

    int get() const{
        return i_;
    }

private:
    int i_;
};

using IntegerPtr = std::unique_ptr<Integer>;

int main() {
    IntegerPtr p1 = std::make_unique<Integer>(4);
    IntegerPtr p2 = std::make_unique<Integer>(5);
    IntegerPtr p3 = std::make_unique<Integer>(6);
    std::vector<IntegerPtr> vectorOfIntegerPointers({
        std::move(p1),
        std::move(p2),
        std::move(p3),
    });

    int i = 5;

    auto first_index_larger_than_i = std::find_if(vectorOfIntegerPointers.begin(), vectorOfIntegerPointers.end(), [&](IntegerPtr s) {
        return s->get() > i;
    });

    std::cout << first_index_larger_than_i.get() << std::endl;

    return 0;
}

失败

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:1881:31: error: call to implicitly-deleted copy constructor of 'std::__1::unique_ptr<Integer, std::__1::default_delete<Integer> >'
            ::new((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
                              ^   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

最佳答案

代码中有 2 个问题都导致尝试复制不可复制的 unique_ptr .

  1. unique_ptr无法传递给 vector(initializer_list)构造函数,因为 initializer_list将其元素包装为 const对象,和一个 const无法移动对象。因此,移动构造函数不参与重载决策,仅留下复制构造函数作为候选对象,稍后无法编译并出现您看到的错误:“调用隐式删除的复制构造函数”。

    所以你必须使用另一种解决方案来构造vector<unique_ptr> ,例如使用 push_back :

     std::vector<IntegerPtr> vectorOfIntegerPointers;
     vectorOfIntegerPointers.push_back(std::make_unique<Integer>(4));
     vectorOfIntegerPointers.push_back(std::make_unique<Integer>(5));
     vectorOfIntegerPointers.push_back(std::make_unique<Integer>(6));
    

    或者写一个包装器来保存 unique_ptr作为mutable成员 ( example )。

  2. [&](IntegerPtr s) { ... }用于 std::find_if尝试获取 unique_ptr 的实例按值(value)。但是unique_ptr不可复制,因此出现相同的错误。

    一个快速的解决方法是通过引用代替它们:

    [&](IntegerPtr const& s) { ... }

关于c++ - 如何将 std::find_if 与唯一指针 vector 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66918167/

相关文章:

c++ - 2个unique_ptr的 map

algorithm - 用于在两个非常长的文本序列中查找唯一集的快速算法

algorithm - 具有最小边权重和节点权重 >= Val 的子图

algorithm - 在网格中查找 'lakes'(包含 0)?

c++ - 如何给 child 一个指向 parent 的弱指针? (C++)

c++ - 如何将 memcpy 与 unique_ptr 一起使用

c++ - 修改 std::string::op[] 的结果是否合法?

c++ - 为实体组件系统实现多态组件

c++ - 如何将 Qline 坐标发送到 QPainter Widget

c++ - 我应该尝试返回一个数组,还是有更好的解决方案?