首页 > 解决方案 > 直接创建节点句柄

问题描述

据我了解,C++17 的节点句柄允许您在某些容器内部和外部拼接项目,而无需实际移动键和值对象。这很好,例如,如果您需要在程序的其他部分保留对它们的一些引用。根据原则,您还可以将节点句柄保留在任何容器之外一段时间,但仍然能够访问键和值对象(并且仍然不会破坏对它的引用)。

在我的程序中,直接创建节点句柄并稍后将其插入地图是有意义的。直接从节点句柄开始(而不是创建键和值对象并使用非节点句柄插入调用将它们插入到映射中)对我来说很棒,因为我可能会立即引用该值,这将即使该项目被插入到地图中,它仍然有效。

但是,它似乎不是std::map::node_type. 原则上,我可以创建一个临时地图,在其中放入一个项目,然后将其拼接并销毁地图,但这似乎是一种非常非 C++-y 的方式。有没有更好的办法?如果没有,是否有充分的理由不这样做?

标签: c++c++17

解决方案


您的问题的简短回答是 - 不,您必须使用extract. 尽管您对节点句柄如何工作的想法存在问题。您错误地认为在将节点插入新容器后对该值的引用仍然有效 - 它不会。看看这里

如果元素成功插入到容器中,则在节点句柄拥有该元素时获得的指向该元素的指针和引用无效。


推荐阅读