C ++标准中的矛盾?

时间:2011-05-13 08:05:48

标签: c++

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参数的类型和值。)

4 个答案:

答案 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);
}