c++ - 使用 lambda 表达式作为 std::set 的比较,当它位于向量内时
问题描述
我想将 lambda 表达式用作 std::set 整数的自定义比较。这个网站上有很多答案解释了如何做到这一点,例如https://stackoverflow.com/a/46128321/10774939。确实,
#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;
}
编译和输出
4 3 1
正如预期的那样。但是,当我尝试将这个集合放在一个向量中时
std::vector<std::set<int, decltype(different_cmp)>> vec_of_integers;
vec_of_integers.push_back(integers);
编译器抱怨。我正在使用 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> ]
到目前为止,我看到的大多数错误似乎都与复制集合有关。
所以我的问题是:
为什么上面的代码不起作用,我怎样才能使它起作用,同时仍然使用本地定义的 lambda?
解决方案
这似乎是 MS 编译器中的一个错误,因为它可以很好地与 GCC 和 Clang 一起编译。
要使其在 MS Compiler (Visual Studio 2017) 中工作,您可以执行以下操作:
std::vector<std::set<int, decltype(different_cmp)>> vec_of_integers{integers};
这编译得很干净。见这里。
推荐阅读
- c - 如何使用c中的指针反转数组
- javascript - 页面加载时的多个异步调度会产生错误?
- django - 如何在 RedirectView 中自定义 url
- python - 为什么 Python 3 中这个简单的整数除法给我的答案比预期的少一个?
- android - 切换片段时reccyclerview消失
- sql-server - 指定 CollectionAggregate 使用的顺序
- python - 运行带有多个核心的snakemake
- javascript - Javascript onsubmit() 函数没有做任何事情
- rust - 错误 LNK2019:函数“enum nfdresult_t __cdecl SetDefaultPath”中引用的未解析外部符号 __imp_SHCreateItemFromParsingName
- c++ - 用于对多个 True 或 False 测试进行评分的 C++ 程序