构造指针类型的 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】:

虽然内置运算符 &lt; 确实只适用于指向同一数组的指针,但 std::setstd::map 不使用该运算符 - 它们使用 std::less。反过来,这可以保证对所有指针施加总顺序:

[comparisons]/2 对于模板lessgreaterless_equalgreater_equal,任何指针类型的特化都会产生严格的总顺序,这些顺序是一致的并且也与内置运算符&lt;&gt;&lt;=&gt;= 施加的偏序一致。

【讨论】:

我想知道为什么&lt; 不能将指向不同数组的元素的指针进行比较。为什么不能像std::less这样比较内存地址 @GauravSehgal 如果我不得不猜测,我怀疑这与 C++ 标准化时流行的 segmented memory 架构有关。 @GauravSehgal 不同的对象可能有不同的存储和地址方案。

以上是关于构造指针类型的 std::set 是不是有效?的主要内容,如果未能解决你的问题,请参考以下文章

std::set 作为类成员不能使用函数指针作为 key_comp

错误:类型不是 ES5/ES3 中的有效异步函数返回类型,因为它没有引用与 Promise 兼容的构造函数

当字符串保存在集合中时,c_str() 是不是仍然有效

使用指向第一个成员的指针调用 free 是不是有效?

使用 gdb 检查指针是不是可能在核心转储中有效 [重复]

std :: unordered_set :: find - 仅为find()构造一个实例