一、multiset介绍
multiset是关键字的集合的一个容器,允许重复关键字,multiset默认使用less 对关键字进行排序,如果需要重载自己定义的关键字比较函数,增加模板类型参数,并且传递自己定义的比教函数:
class Foo {
public:
Foo() :data(0) {}
int data;
};
bool compare(const Foo& lhs, const Foo& rhs) {
return lhs.data < rhs.data;
}
multiset<Foo, decltype(compare)*> FooSet(compare);//直接将比较函数传给容器FooSet
multiset<Foo, decltype(compare)*> FooSet{compare}; //将小括号改为大括号也行
但是,当compare函数与FooSet都是类Foo的对象的时候,上述代码有坑;
class Foo {
public:
Foo() :data(0) {}
int data;
bool compare(const Foo& lhs, const Foo& rhs) {
return lhs.data < rhs.data;
}
multiset<Foo, decltype(compare)*> FooSet(compare);
};
此时需要做如下改进,改代码才可以通过编译:
1) compare函数需要定义成static的;
2) compare外面的小括号需要改成大括号;
修改后的代码如下所示:
class Foo {
public:
Foo() :data(0) {}
int data;
static bool compare(const Foo& lhs, const Foo& rhs) {
return lhs.data < rhs.data;
}
multiset<Foo, decltype(compare)*> FooSet{ compare };
};
为什么要将compare的小括号改为大括号?
如果是小括号,编译器会将multiset<Foo, decltype(compare)*> FooSet(compare );翻译成一个函数,此时遇到compare不是一个类型,会出错;
具体可参考博文: https://www.cnblogs.com/tangzhenqiang/p/4332801.html