Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在有序STL容器中是否允许指针作为键? 有WRT C++ STD.< 所以我想知道C++ STD在命令的标准库(STL)容器中使用指针作为键的情况,也就是说允许使用< /P>_C++_Pointers_Standards_Containers - Fatal编程技术网

在有序STL容器中是否允许指针作为键? 有WRT C++ STD.< 所以我想知道C++ STD在命令的标准库(STL)容器中使用指针作为键的情况,也就是说允许使用< /P>

在有序STL容器中是否允许指针作为键? 有WRT C++ STD.< 所以我想知道C++ STD在命令的标准库(STL)容器中使用指针作为键的情况,也就是说允许使用< /P>,c++,pointers,standards,containers,C++,Pointers,Standards,Containers,std::map 这是因为std::less或内置运算符的规范是。指针可以通过操作符进行比较,我会给出的答案是“它们可能有效,但不有效” 显然,您提出了可比性的问题,但您不想这样做的原因是因为缺乏对“普通”指针的参考管理。在不将对象从容器中移除的情况下,很容易删除该对象,这会导致无效指针和下次访问时的访问冲突。是的,因为它使用std::less,即使我想添加另一个不这样做的原因,这也是导致总顺序所必需的。如果您以这种方式使用指针,并且碰巧有一个bug依赖于容器元素的顺序,那么很难找到它。即使你的

std::map


这是因为
std::less
内置运算符的规范是。指针可以通过操作符进行比较,我会给出的答案是“它们可能有效,但不有效”


显然,您提出了可比性的问题,但您不想这样做的原因是因为缺乏对“普通”指针的参考管理。在不将对象从容器中移除的情况下,很容易删除该对象,这会导致无效指针和下次访问时的访问冲突。

是的,因为它使用
std::less
,即使
我想添加另一个不这样做的原因,这也是导致总顺序所必需的。如果您以这种方式使用指针,并且碰巧有一个bug依赖于容器元素的顺序,那么很难找到它。即使你的程序看起来是完全确定的,它也不会。容器中元素的顺序取决于内存分配器使用的算法,这完全不受您的控制。如果在不重新启动程序的情况下多次运行同一示例,有些可能会失败,而有些可能会成功

这是痛苦经历的声音。我曾经使用调试器项目来完成这个任务,在那里我有容器中装满了C++符号。当我需要对符号进行排序时,我最终得到了不同的符号,但它们具有相同的名称(想想重载函数),并且在所有其他方面都是相同的。因此,在本例中,我最后通过符号对象的地址对它们进行了比较。我遇到了几个明显不确定的bug,其中不确定就是由这种现象引起的。有时需要10或15次以上的尝试才能重现问题。我最终花了些时间取消了按地址排序,从长远来看,这为我节省了很多麻烦


话虽如此,我不会说我最近没有这样做。但每次我这样做时,我都觉得这是一个错误。

只有当它们指向同一数组的元素时。C++标准对STD:更强的保证:更少,这是有序关联的默认值。containers@sellibitze:指针与数组无关。指向不同数组元素的指针是不可比拟的。@笑话:不,标准不允许将任意指针与<代码比较>。C++标准对此没有保证。但很有可能,它在大多数实现中实现了您想要的功能。仅供参考:我没有投反对票。但也许我应该——考虑到这个答案是错误的,你忽略了批评。§5.9/2,第二个要点:“如果相同类型的两个指针p和q指向不同的对象,而这些对象不是同一对象的成员或同一数组的元素或不同的函数,或者如果其中只有一个为空,那么pq,p=q的结果是未指定的。”顺便说一句,你想用地址作为键还是用它们指向的东西的值作为键?在后一种情况下,您必须提供一个自定义的comparatorrelated:这不一定有效-像unique_ptr或shared_ptr之类的东西很可能会提供基于底层指针的比较运算符。这一短语稍有不同:在下面的回答中引用sellibitze的注释:"... 在关联容器中使用指针作为键是安全的。但这与不小于操作符的情况无关,因为STD::对于这些容器来说,默认是比较小的,C++对STD有特殊的保证:在T是指针类型的情况下,更少。"