2016-04-23 13 views
1

コンテナにオブジェクトがあると、参照/イテレータ/ポインタを検索せずに(例: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; 
} 

私はコストを支払うことなく、後でこのノードの競合変更できるようにstd::unordered_map<uint32_t,Node> nodes;内部に割り当てられclass Nodeのインスタンスへの参照/ポインタ/イテレータを返すために必要 std::unordered_map<uint32_t,Node*> nodes;

をしかし、私は中にいることを考える:find()

私は、ポインタを使用する場合、私はこの問題を持っていないだろう、確かには、IEパフォーマンス上の理由から、私の特別なケースはstd::unordered_map<uint32_t,Node>となるでしょう。メモリ内のジャンプが少なくなります)。

答えて

2

std::unordered_map::insertは、新しく挿入された要素に反復子*を返します。

あなたは既にそれを持っています。それはちょうどあなたのコードでは、現時点では、あなたはそれを放棄している。


*まあ、それを包むペア。それはあなたが電話するinsertに依存します。あなたのケースでは:

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

はい、あなたが正しい、私は:: 'のstdのリファレンスを読んunordered_map ::挿入()'慎重に、と私は、インサートは、ノード 'へのポインタ/参照/イテレータを返す必要があることを期待しませんでした'、Pair >、bool>' ...ではなく、エラーメッセージで混乱しました。 –

関連する問題