【发布时间】:2019-05-31 19:32:01
【问题描述】:
我想要以下代码的自定义比较器。但是,我不允许超载operator()、std::less、std::greater。
我尝试使用 lambda 实现此目的,但 gcc 不允许我使用 auto 作为非静态成员。还有其他方法可以完成这项工作吗?
#include <iostream>
#include <map>
#include <set>
class Test
{
public:
// bool operator () (const int lhs, const int rhs) { // not allowed
// return lhs > rhs;
// };
using list = std::multiset<int /*, Test*/>;
std::map<const char*, list> scripts;
};
int main()
{
Test t;
t.scripts["Linux"].insert(5);
t.scripts["Linux"].insert(8);
t.scripts["Linux"].insert(0);
for (auto a : t.scripts["Linux"]) {
std::cout << a << std::endl;
}
std::cout << "end";
}
编辑:使用 lambda
class Test
{
public:
auto compare = [] (const int a, const int b) { return a < b;}
using list = std::multiset<int, compare>; //here
std::map<const char*, list> scripts;
};
错误:
'auto' not allowed in non-static class member
auto compare = [] (const int a, const int b) { return a < b;}
【问题讨论】:
-
"但是,我不能重载 operator()" 你的意思是它没有工作,或者你不被允许这样做?
-
您打算比较哪些类型?顺便说一句,比较 const char* 值不是一个好主意,因为这只是指针的比较;此外,使用相同的字符串文字,即“Linux”实际上可以产生两个不同的指针。我建议使用 std::string 作为 std::map 中的键
-
@HolyBlackCat 不允许
-
@Dmitry Kuzminov 哦。你是对的。我只是将一个示例程序放在一起,但感谢您指出这一点。
-
您在哪里尝试使 lambda 工作?这个不允许的“汽车”在哪里? (如果您想要一个更有用的答案,展示您迄今为止尝试过的内容是一个好主意。)
标签: c++ c++11 lambda multimap custom-compare