static std::map<pnode, pnode*> nid;
pnode* ptrof(pnode &pn) {
auto r = nid.insert( {pn, nullptr} );
if (r.second) {
nid[pn] = &(r.first->first);
return nid[pn];
}
return r.first->second;
}
上面的代码尝试将指向映射中键的指针存储为映射中键的值。
只要密钥本身没有被删除或擦除,就可以安全地假设指向密钥的指针在映射 nid 的生命周期中保持有效吗?
我实现了这个并注意到它有效。
是的,
std::map<K, T>
是一个基于节点的容器,其中每个元素(value_type
类型的对象,即pair<const K, T>
)都是一个单独分配的“节点”。元素永远不会通过内部操作重新分配映射,因此整个元素(键和映射数据)的地址是稳定的,只有从映射中删除该元素或销毁映射才会失效。
对于
set
、multiset
、multipap
及其 unordered_
版本也是如此。
此外,从 C++17 开始(因此不适用于您的问题),您还可以提取节点并将它们插入到其他映射中,并且保留分配。