0

私は Google のsparsehashmapを使用しており、値が挿入または検索されたかどうかを調べようとしています。以下は機能しますが、明らかに2回検索しています。ダブルルックアップなしでそれを行うにはどうすればよいですか?

Element newElement = Element();
bool  inserted = ((*map).insert(pair<const int64, Element>(key, newElement))).second;
Element element = (*(((*map).insert(pair<const int64, Element>(key, newElement))).first)).second;
if (inserted)
    puts("INSERTED");

見つかったデフォルトの Element と挿入されている newElement を区別したいので、 Element (構造体) の内容を確認できません。クラス((*map).insert(pair<const int64, Element>(key, newElement)))にプライベートな型を含むテンプレート型であるため、変数に割り当てる方法がわかりませんでした。sparse_hash_map

4

1 に答える 1

2

これを試して:

typedef sparse_hash_map<...>::iterator sh_iterator; //you already have this, haven't you?

std::pair<sh_iterator, bool> res = map->insert(std::make_pair(key, newElement));
if (res.second)
    puts("INSERTED");

何らかの理由で関数が気に入らない場合はstd::make_pair、ペアタイプのtypedefを検討する必要があります。

typedef pair<const int64, Element> map_pair;

とにかく、のreturn typeinsertpair<iterator, bool>、であり、AFAIKiteratorはクラスのパブリックtypedefです。

insertところで、挿入された要素に到達するために2番目の...を実行する理由がわかりませんか?おそらく、参照として宣言する必要がelementあります。私の提案したコードでは:

Element &element = res.first->second;

当然、C ++ 11を使用している場合は、次のようにすることができます。

auto res = ...;
于 2012-10-15T09:06:23.307 に答える