我一直在尝试在
std::binary_search
上使用 std::lower_bound
和 std::array<unique_ptr<int>>
只是为了掌握它。我遇到了以下问题:
#include <array>
#include <memory>
#include <algorithm>
int main() {
std::array<std::unique_ptr<int>, 3> a = {std::make_unique<int>(1),
std::make_unique<int>(2), std::make_unique<int>(5)};
auto t = std::binary_search(a.begin(), a.end(), 5, []
(std::unique_ptr<int> x, std::unique_ptr<int> y) {
return x.get() < y.get();
});
return 0;
}
我试图将我自己的比较放在这里,类似于使用
std::sort
之类的东西来完成。但是,在编译时出现错误cannot convert argument 1 from 'const _Ty' to 'std::unique_ptr<int,std::default_delete<int>>'
我应该改变什么才能使这项工作正常进行?
编辑:来自 Visual Studio 的完整错误消息
Severity Code Description Project File Line Suppression State Details
Error C2664 'bool thng_already::<lambda_1>::operator ()(std::unique_ptr<int,std::default_delete<int>>,std::unique_ptr<int,std::default_delete<int>>) const': cannot convert argument 1 from 'const _Ty' to 'std::unique_ptr<int,std::default_delete<int>>'
with
[
_Ty=int
] Proj C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\include\algorithm 7028
当用
std::make_unique<int>(5)
替换 5 时,我们有一个不同的错误
Severity Code Description Project File Line Suppression State Details
Error C2280 '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 Proj C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\include\algorithm 7028
您的 lambda 按值获取参数。这意味着
binary_search
实现在将参数传递给 lambda 时必须复制参数。可以复制吗unique_ptr
?不,这就是它不起作用的原因。改为通过 const 引用获取参数。
int main() {
std::array<std::unique_ptr<int>, 3> a = {std::make_unique<int>(1),
std::make_unique<int>(2), std::make_unique<int>(5)};
auto t = std::binary_search(a.begin(), a.end(), 5,
[](const std::unique_ptr<int>& x, const std::unique_ptr<int>& y) {
return x.get() < y.get();
});
return 0;
}