0

我正在使用 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 的内容(它是一个结构),因为我想区分找到的默认 Element 和插入的 newElement。我不知道如何分配((*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函数,你应该考虑为 pair 类型使用 typedef:

typedef pair<const int64, Element> map_pair;

无论如何,返回类型insertpair<iterator, bool>,AFAIKiterator是该类的公共 typedef。

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

Element &element = res.first->second;

当然,如果您使用的是 C++11,您可以简单地执行以下操作:

auto res = ...;
于 2012-10-15T09:06:23.307 回答