对于构造指针类型的 std::set 是有效的

Is is valid to construct std::set of pointer type?

本文关键字:set 有效 于构造 std 类型 指针      更新时间:2023-10-16

我想在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

其他一些问题说,即使<,>不被C++指针直接支持,std::less 与纯指针一起工作(没有任何额外的信息)。但我找不到任何参考。

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

[比较]/2 对于模板lessgreaterless_equalgreater_equal,任何指针类型的专用化都会产生一个严格的总顺序,这些专用化在这些专用化之间是一致的,并且也与内置运算符<><=>= 强加的偏序一致。