获取刚刚插入容器的对象的迭代器或引用

时间:2016-04-23 16:59:23

标签: c++ c++11 iterator containers

当我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;会更好(即内存跳跃较少)。

1 个答案:

答案 0 :(得分:2)

std::unordered_map::insert将迭代器*返回给新插入的元素。

所以你已经拥有它了。只是在你的代码中,你将它扔掉了。

*嗯,还是包裹它的一对。这取决于你呼叫的insert。在你的情况下:

nod_it = nodes.insert( {key, node} ).first;