std::binary_search 和 lower_bound 以及 unique_ptr 数组

问题描述 投票:0回答:1

我一直在尝试在

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        
c++ c++11 smart-pointers
1个回答
0
投票

您的 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.