构造指针类型的std :: set有效吗?

时间:2018-12-26 04:55:07

标签: c++

我想将一些指针存储到std :: set中,但是标准指南说这是无效的。

  

如果相同类型的两个指针p和q指向不同的对象,这些对象不是同一对象的成员,也不是同一数组的元素,或者指向不同的>函数,或者如果其中只有一个为null,则结果为pq,p <= q和> p> = q未指定。

天真的指针类型似乎不支持<,>运算符,如下所示。

Object * a = new Object;
Object * b = new Object;
a == b; // valid
a < b; //invalid
Object * arr = new Object[10];
&arr[3] == &arr[4]; // valid
&arr[3] < &arr[4]; // valid

如何将指针放入std :: set或std :: map的键中?我是否应该定义一些支持比较的包装器

编辑1

Some other questions说,即使C ++指针不直接支持<,>,std :: less对于纯指针(没有任何额外信息)也可以正常工作。但是我找不到任何参考。

1 个答案:

答案 0 :(得分:8)

虽然确实是内置运算符<仅适用于指向同一数组的指针,但是std::setstd::map不使用该运算符-它们使用{{1} }。反过来,这保证对所有指针施加总顺序:

  

[比较] / 2 对于模板std::lesslessgreaterless_equal,任何指针类型的专业化都会产生一个严格的总顺序在这些专业领域之间是一致的,并且还与内置运算符greater_equal<><=施加的部分顺序一致。