std::map
必须满足第 23.1.2/2 段中指定的关联容器的要求:
每个关联容器都是 在键和排序上参数化 关系 比较 那 诱导 严格 元素上的弱排序 (25.3) 钥匙。此外,地图和多地图 将任意类型 T 与 钥匙。比较类型的对象是 称为 的比较对象 容器。此比较对象可能 是指向函数或对象的指针 具有适当功能的类型 呼叫接线员。
但是在第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
参数的类型和值)。
比较是比较器的类型。 事实上,它是用 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);
}
这个:
class Compare
并不意味着比较必须是一个类。如果它说:
typename Compare
可以使用提供类似函数调用语义的任何类型,例如函数指针。
像这样指定它:
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 ^^^^^^^^^^^
比较器的类型和值;例如,请使用这个:
int main()
{
std::map<foo, bool, bool(*)(const foo&, const foo&)> fooMap(compare_foo);
}