在地图中添加指向地图中键的指针

问题描述 投票:0回答:1
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 的生命周期中保持有效吗?

我实现了这个并注意到它有效。

c++ stl c++14
1个回答
0
投票

是的,

std::map<K, T>
是一个基于节点的容器,其中每个元素(
value_type
类型的对象,即
pair<const K, T>
)都是一个单独分配的“节点”。元素永远不会通过内部操作重新分配映射,因此整个元素(键和映射数据)的地址是稳定的,只有从映射中删除该元素或销毁映射才会失效。

对于

set
multiset
multipap
及其
unordered_
版本也是如此。

此外,从 C++17 开始(因此不适用于您的问题),您还可以提取节点并将它们插入到其他映射中,并且保留分配。

© www.soinside.com 2019 - 2024. All rights reserved.