C++标准的矛盾

  • 本文关键字:矛盾 标准 C++ c++
  • 更新时间 :
  • 英文 :


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

最新更新