std::map
必须满足第23.1.2 / 2段中指定的关联容器的要求:
每个关联容器都是 在Key上进行参数化和排序 关系比较诱导严格 关于元素的弱排序(25.3) 键。另外,map和multimap 将任意类型T与 键。 Compare类型的对象是 称为a的比较对象 容器。该比较对象可以 是一个指向函数的指针或一个对象 具有适当功能的类型 呼叫运营商。
但是在第23.3.1 / 2段中,std::map
模板被指定为:
template <class Key, class T, class Compare = less<Key>,
class Allocator = allocator<pair<const Key, T> > >
class map;
似乎明确禁止将函数指针用作Compare
。这是矛盾还是我不能正确理解标准?
编辑:是的,我真正遇到的问题是为什么代码像GMan的例子:
struct foo
{
int x;
};
bool compare_foo(const foo& x, const foo& y)
{
return x.x < y.x;
}
std::map<foo, bool, compare_foo> fooMap;
不会编译(是的,我愚蠢地混淆了Compare
参数的类型和值。)
答案 0 :(得分:7)
比较是比较器的类型。使用class
而不是typename
声明它的事实并没有什么区别,你可以有一个指向函数作为类型的指针,并在map构造函数中提供你的函数。
#include <map>
bool myCmp(int a, int b) {
return a < b;
}
void foo()
{
std::map<int, char*, bool (*)(int, int)> m(myCmp);
}
答案 1 :(得分:5)
此:
class Compare
并不意味着Compare必须是一个类。如果说:
,可能会更清楚typename Compare
您可以使用任何提供类似函数调用语义的类型,例如函数指针。
答案 2 :(得分:3)
像这样指定:
struct foo
{
int x;
};
bool compare_foo(foo x, foo y)
{
return x.x < y.x;
}
// vvvvvvvvvvvvvvvvv function pointer type
std::map<foo, bool, bool(*)(foo, foo)> fooMap(compare_foo);
// function pointer value ^^^^^^^^^^^
答案 3 :(得分:2)
你混淆了比较器的类型和价值;使用这个例如:
int main()
{
std::map<foo, bool, bool(*)(const foo&, const foo&)> fooMap(compare_foo);
}