确定元素是否已插入哈希映射中

时间:2012-10-15 09:02:04

标签: c++ hashmap

我正在使用Google的sparsehashmap,并试图找出插入或查找的值。以下工作,但显然它正在查找两次。如果没有双重查找,我该怎么做?

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。我无法弄清楚如何将((*map).insert(pair<const int64, Element>(key, newElement)))分配给变量,因为它是包含sparse_hash_map类私有类型的模板类型。

1 个答案:

答案 0 :(得分: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;

无论如何,insert的返回类型为pair<iterator, bool>,而AFAIK iterator是该类的公共typedef。

顺便说一句,我不明白你为什么要做第二个insert ...来获取插入的元素?您可能应该声明element作为参考。在我建议的代码中:

Element &element = res.first->second;

当然,如果你使用的是C ++ 11,你可以这样做:

auto res = ...;