如何将 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
.
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 )。[&](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/