作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我 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;
内部分配这样我以后就可以修改这个节点的竞争,而无需支付 find()
的费用
当然,当我使用指针时我不会有这个问题,即: std::unordered_map<uint32_t,Node*> nodes;
但我认为在我的特定情况下会是 std::unordered_map<uint32_t,Node>
出于性能原因(即减少内存跳跃)更可取。
最佳答案
std::unordered_map::insert
返回新插入元素的迭代器*。
所以你已经拥有它了。只是,目前在您的代码中,您正在将其丢弃。
* 好吧,或者是包裹它的一对。这取决于您调用哪个 insert
。在你的情况下:
nod_it = nodes.insert( {key, node} ).first;
关于c++ - 获取刚插入容器的对象的迭代器或引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36813786/
我是一名优秀的程序员,十分优秀!