对C++标准中的指针通用少<>

31 c++

很多时候我需要一组指针.每次发生这种情况时,我最终都会为指针类型编写一个较少的<>实现 - 将两个指针强制转换为size_t并比较结果.

我的问题是 - 标准中是否提供?我找不到那样的东西.似乎很常见的情况......

更新:似乎即将推出的标准修复了所有问题,并为指针类型和包含的unordered_set提供了较少的<>.几年后,这个问题将毫无意义.

同时,当前标准没有"合法"的解决方案,但size_t演员工作.

更新更新:好吧,我会很惊讶!不只

std::map<void *, int, std::less<void*> > myMap;
Run Code Online (Sandbox Code Playgroud)

工作,但甚至

std::map<void *, int > myMap;
Run Code Online (Sandbox Code Playgroud)

同样.

这是在gcc 3.4.1.我一直在做所有这些演员阵容,而且litb是完全正确的.甚至他引用的章节编号在当前标准中也完全相同.欢呼!

Joh*_*itb 31

两个指针可以使用该比较的函数对象进行比较less, greater等等.否则,使用毯operator<等,如果指针指向相同的数组对象或一个过去的端部的元件,这是唯一可能的.否则,结果未指定.

20.3.3/8 在C++ 03中

对于模板greater,less,greater_equal,和less_equal,对于任何指针类型的专业化产生总订单,即使内置的运营商<,>,<=,>=没有.

无需显式专门化和手动转换为size_t:这会降低可移植性,因为reinterpret_cast从指针到整数的映射是实现定义的,不需要产生任何顺序.


编辑:有关更详细的答案,请参阅答案.

  • @Neil:"架构可能不支持可比指针".我不明白这是多么重要.该标准并未规定std :: less必须快!它只需要提供订购.如果架构不支持它,那么编译器/库需要提供某种替代机制来获得排序.例如,将地址映射到订单值的查找表.仅仅因为架构不支持它并不意味着它无法完成. (5认同)
  • 尼尔,在我看来,标准*确实*明确说明"任何指针类型的特化产生总订单".如果仍有未定义的行为,则不能拥有总订单,因此该语句必须从模板中删除未定义. (4认同)
  • 顺便说一句,我可以建议更多的人投票原始问题吗?事实证明这是一个非常好的问题! (4认同)
  • @Neil查看`19.5.1.3/3`中的最新草稿,它根据`std :: less <stuff>()(this,&rhs)`用一个音符定义`operator <`for`error_category`*"less提供指针的总排序"*. (4认同)
  • 万一有人在数,我是另一个投票"Neil误读了规范".总订单表示整个类型的总订单.仅包括某些值的"总订单"在技术上被称为"部分订单".我推测与C不同的原因恰恰是如果int*不具有可比性,则无法实现std :: set <int*>.因此,该标准规定int*具有可比性.我不明白的是为什么标准不只是说operator <for pointers和std :: les一样. (3认同)
  • 你为什么这么认为?它说"任何指针类型的特化产生总订单".在没有任何限制值的情况下,即使明确提到它不依赖于`operator <`等,boost的shared_ptr实现也使用`std :: less`进行比较. (2认同)
  • @Neil:你和我无法比较任意指针,但所有强大的编译器/库实现*都可以*.它们提供了'std :: less'的特化,它使用一些内部魔法来进行比较,它将返回一个有效的结果. (2认同)
  • @Neil什么都没说,标准库以任何方式都以任何方式约束了标准规则.标准的描述,例如`std :: less`返回`a <b`只是一个*as-if*规则.因此,如果将用户定义的类型放到`std :: less`中,那么它的行为就像在它上面调用`operator <`(当然,将调用`operator <`来满足规则).但是如果你提供一个指针,那么额外的保证很重要,并且比较结构良好. (2认同)
  • 它并没有说明在同一个街区.如果那个限制仍然存在,那么整个声明将不值得包含在标准中,因为它不会与已经为内置运算符定义的内容有任何不同.相反,该标准明确指出模板与内置运算符*不同*. (2认同)
  • @onebyone:“为什么标准不只是说 operator&lt; 指针的作用与 std::less 相同”。性能和不为不需要的东西付费的原则。考虑您的指针确实指向同一个数组对象的位置,然后您希望能够利用“快速”比较。当你没有那个保证时,你使用 std::less 。 (2认同)
  • @all问题是关于clc ++ m的http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/28c38b920600bf6f/af5c98f53ed635e7#af5c98f53ed635e7 - 到目前为止所有的点评说服的答案: - ( (2认同)