使用lambda表达式作为比较std :: set,当它在一个向量中时

x43*_*2ph 5 c++ lambda stl stdvector stdset

我想使用lambda表达式作为std ::整数集的自定义比较.该网站上有许多解释如何执行此操作的答案,例如/sf/answers/3228982501/.事实上,

#include <vector>
#include <set>
#include <iostream>

int main() {

    auto different_cmp = [](int i, int j) -> bool {
        return j < i;
    };

    std::set<int, decltype(different_cmp)> integers(different_cmp);

    integers.insert(3);
    integers.insert(4);
    integers.insert(1);
    for (int integer : integers) {
        std::cout << integer << " ";
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编制和输出

4 3 1

正如所料.但是,当我尝试将此设置放在矢量中时

    std::vector<std::set<int, decltype(different_cmp)>> vec_of_integers;
    vec_of_integers.push_back(integers);
Run Code Online (Sandbox Code Playgroud)

编译器抱怨.我正在使用Visual Studio 2017,我根据周围的代码得到不同的编译器错误.在上面的例子中,它是

1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\utility(77): error C2664: 'void std::swap(std::exception_ptr &,std::exception_ptr &) noexcept': cannot convert argument 1 from '_Ty' to 'std::exception_ptr &'
1>        with
1>        [
1>            _Ty=main::<lambda_48847b4f831139ed92f5310c6e06eea1>
1>        ]
Run Code Online (Sandbox Code Playgroud)

到目前为止我看到的大多数错误似乎都与复制集有关.

所以我的问题是:

为什么上面的代码不起作用,我怎样才能使它工作,同时仍然使用本地定义的lambda?

P.W*_*P.W 1

这似乎是 MS 编译器中的一个错误,因为它与 GCC 和 Clang 编译得很好。

要使其在 MS 编译器 (Visual Studio 2017) 中工作,您可以执行以下操作:

std::vector<std::set<int, decltype(different_cmp)>> vec_of_integers{integers};
Run Code Online (Sandbox Code Playgroud)

这编译得很干净。看这里