首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++标准中的矛盾?

C++标准中的矛盾?
EN

Stack Overflow用户
提问于 2011-05-13 08:05:47
回答 4查看 923关注 0票数 2

std::map必须满足第23.1.2/2段中指定的关联容器的要求:

对每个关联容器在键上进行参数化,并进行排序关系比较,从而导致对键元素的严格弱排序(25.3)。此外,map和multimap将任意类型的T与键相关联。类型比较的对象称为容器的比较对象。此比较对象可以是函数的指针,也可以是具有适当函数调用运算符的类型的对象。

但在第23.3.1/2段中,std::map模板被指定为:

代码语言:javascript
复制
template <class Key, class T, class Compare = less<Key>,
          class Allocator = allocator<pair<const Key, T> > >
class map;

它似乎明确禁止使用函数指针作为Compare。这是一个矛盾,还是我没有正确理解标准?

编辑:是的,我真正遇到的问题是为什么像GMan这样的代码:

代码语言:javascript
复制
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参数的类型和值)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-13 08:14:19

比较是比较器的类型。它是用class而不是typename声明的,这一点并没有什么区别,您可以在映射构造函数中有一个函数类型的指针,并给出函数。

代码语言:javascript
复制
#include <map>

bool myCmp(int a, int b) {
    return a < b;
}

void foo()
{
    std::map<int, char*, bool (*)(int, int)> m(myCmp);
}
票数 7
EN

Stack Overflow用户

发布于 2011-05-13 08:10:02

这是:

代码语言:javascript
复制
class Compare

并不意味着比较必须是一个类。如果它说:

代码语言:javascript
复制
typename Compare

您可以使用提供类似函数调用语义的任何类型,例如函数指针。

票数 5
EN

Stack Overflow用户

发布于 2011-05-13 08:08:16

请如下所示:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5989010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档