当我insert()
将一个对象放入容器std::unordered_map时,如何在不搜索它的情况下获取其位置的引用/迭代器/指针(例如find()
;这将意味着不必要的开销)。
我的意思是,容器数据结构应该知道它存储我的对象的位置,而不进行搜索。
考虑这段代码:
class Node{
public:
int id;
double mass;
};
std::unordered_map<uint32_t,Node> nodes;
Node& tryInsertNode( uint32_t key, const Node& node ){
auto nod_it = nodes.find( key );
if ( nod_it == nodes.end() ){
nodes.insert( {key, node} );
nod_it = nodes.find( key ); // this is silly, I don't want to do this !!!
// nod_it = ??? // JUST GIVE ME MY POINTER !!!
}else{
nod_it->second = node;
};
return nod_it->second;
}
我需要将引用/指针/迭代器返回到在class Node
内分配的std::unordered_map<uint32_t,Node> nodes;
实例,以便稍后我可以修改此节点的竞争,而无需支付{{1}的费用}
当然,当我使用指针时,我不会遇到这个问题,即:
find()
但我认为在我的特定情况下,出于性能原因std::unordered_map<uint32_t,Node*> nodes;
会更好(即内存跳跃较少)。
答案 0 :(得分:2)
std::unordered_map::insert
将迭代器*返回给新插入的元素。
所以你已经拥有它了。只是在你的代码中,你将它扔掉了。
*嗯,还是包裹它的一对。这取决于你呼叫的insert
。在你的情况下:
nod_it = nodes.insert( {key, node} ).first;