使用非默认比较谓词的集合容器

Container of sets using non-default comparison predicate

本文关键字:集合 谓词 比较 默认      更新时间:2023-10-16

我想创建一个std::map<T1, std::set<T2> >,其中set使用非默认比较器。例如,如果我单独声明set,我会将其声明为:

std::set<int,bool(*)(int,int)> s (fn_pt);

,其中fn_pt为函数指针。在我的示例中,当我向std::map添加一个新键时,我希望使用该非默认比较器构造该集合。这种事可能吗?

更复杂的是,我的编译器不支持c++ 11,所以我只能接受一个不需要c++ 11的解决方案;但是,如果c++ 11有这样的方法,我也会很感兴趣的。

既然你可以使用函子,那么你应该能够使用:

struct Compare
{
    bool operator () (int lhs, int rhs) { return lhs - 10 < rhs; }
};

int main()
{
    std::map<int, std::set<int, Compare> > data;
}

在map中创建的每个新集合都默认使用模板形参中指定的类型构造。

我不知道你为什么不把你的存根扩展成一个完整的例子:

#include <iostream>
#include <set>
#include <map>
typedef std::set<int,bool(*)(int,int)> Set;
typedef std::map<std::string, Set> Map;
bool f(int a, int b){ return a<b;}
bool g(int a, int b){ return a>b;}
int main() {
Map m;
m["f"] = Set(&f);
m["g"] = Set(&g);
for(int i = -5; i < 5; ++i) {
    m["f"].insert(i);
    m["g"].insert(i);
}
for(Set::iterator i = m["f"].begin(); i != m["f"].end(); ++i){std::cout << *i << " ";}
std::cout << "n";
for(Set::iterator i = m["g"].begin(); i != m["g"].end(); ++i){std::cout << *i << " ";}
std::cout << "n";
return 0;
}
输出:

-5 -4 -3 -2 -1 0 1 2 3 4
4 3 2 1 0 -1 -2 -3 -4 -5 

生活:http://ideone.com/D2qIHO

我认为用自定义比较器创建集合映射绝对没有问题。

我可能误解了这个问题,但是您可以按照常规方式添加键,并以任何您想要的方式构建集合:

bool Cmp(int, int);
typedef std::set<int,bool(*)(int,int)> MySet;
typedef std::map<int, MySet> MyMap;
...
MyMap m;
m[1] = MySet(Cmp);