使用非默认比较谓词的集合容器
Container of sets using non-default comparison predicate
我想创建一个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);
相关文章:
- 处理多个异常集合的C++方法
- std::condition_variable::wait()如何评估给定的谓词
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- 如何将ampl中的集合表示为c++中的向量
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 检查值是否在集合p1和p2中,但不在p3中
- 带过滤器的现代迭代c++集合
- 如何将结构插入到集合中并打印集合的成员
- 集合上的输出迭代器:assign和increment迭代器
- 如何将函数集合传递给客户端类,以便将它们当作客户端类本身的成员使用
- 实现一个在集合上迭代的模板函数
- 尝试使用集合函数时出现分段错误
- 互斥指针的集合
- c++找不到具有相同哈希的无序集合元素
- python集合的C++等价物是什么.计数器
- 如何在C++中递归地按相反顺序打印集合
- Python 集合.计数器,如何避免重复查找
- 如何写向量的无序向量集,即unordered_set<向量<向量<int>>集合?
- 集合和多重集合只是谓词不同吗?
- 使用非默认比较谓词的集合容器