构造指针类型的 std::set 是不是有效?
Posted
技术标签:
【中文标题】构造指针类型的 std::set 是不是有效?【英文标题】:Is is valid to construct std::set of pointer type?构造指针类型的 std::set 是否有效? 【发布时间】:2018-12-26 04:55:07 【问题描述】:我想将一些指针存储到 std::set 中,但标准指南说它无效。
如果相同类型的两个指针 p 和 q 指向不同的对象,这些对象 > 不是同一对象的成员或同一数组的元素或不同的 > 函数,或者如果其中只有一个为空,则结果pq、p 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 也适用于纯指针(没有任何额外信息)。但我找不到任何参考。
【问题讨论】:
我所期望的只是指针的唯一容器,所以比较原始地址对我来说就足够了。我知道我可以使用 std::unordered_map ,但无论如何我应该在这种情况下添加哈希函数 是的。我认为下面的答案解决了我的问题 【参考方案1】:虽然内置运算符 <
确实只适用于指向同一数组的指针,但 std::set
和 std::map
不使用该运算符 - 它们使用 std::less
。反过来,这可以保证对所有指针施加总顺序:
[comparisons]/2 对于模板
less
、greater
、less_equal
和greater_equal
,任何指针类型的特化都会产生严格的总顺序,这些顺序是一致的并且也与内置运算符<
、>
、<=
、>=
施加的偏序一致。
【讨论】:
我想知道为什么<
不能将指向不同数组的元素的指针进行比较。为什么不能像std::less
这样比较内存地址
@GauravSehgal 如果我不得不猜测,我怀疑这与 C++ 标准化时流行的 segmented memory 架构有关。
@GauravSehgal 不同的对象可能有不同的存储和地址方案。以上是关于构造指针类型的 std::set 是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章
std::set 作为类成员不能使用函数指针作为 key_comp