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

时间:2015-07-22 15:34:35

标签: c++ stl set comparator

我想创建一个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的方式,我也有兴趣看到它。

3 个答案:

答案 0 :(得分:2)

由于您可以使用仿函数,因此您应该可以使用:

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


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

在地图中创建的每个新集合都将使用模板参数中指定的类型进行默认构建。

答案 1 :(得分:0)

不确定为什么没有尝试将存根扩展为完整示例:

#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

我认为使用自定义比较器制作套装地图绝对没问题。

答案 2 :(得分:0)

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

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