std::map必须满足第23.1.2/2段中指定的关联容器的要求:
对每个关联容器在键上进行参数化,并进行排序关系比较,从而导致对键元素的严格弱排序(25.3)。此外,map和multimap将任意类型的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参数的类型和值)。
发布于 2011-05-13 08:14:19
比较是比较器的类型。它是用class而不是typename声明的,这一点并没有什么区别,您可以在映射构造函数中有一个函数类型的指针,并给出函数。
#include <map>
bool myCmp(int a, int b) {
return a < b;
}
void foo()
{
std::map<int, char*, bool (*)(int, int)> m(myCmp);
}发布于 2011-05-13 08:10:02
这是:
class Compare并不意味着比较必须是一个类。如果它说:
typename Compare您可以使用提供类似函数调用语义的任何类型,例如函数指针。
发布于 2011-05-13 08:08:16
请如下所示:
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 ^^^^^^^^^^^https://stackoverflow.com/questions/5989010
复制相似问题