我试图在C ++中实现哈希聚合算法。
这是伪代码:
for each input row
begin
calculate hash value on group by column(s)
check for a matching row in the hash table // calculate hash function **(A)**
if we do not find a match
insert a new row into the hash table // calculate hash function again? **(B)**
else
update the matching row with the input row
end
output all rows in the hash table
使用STL(C ++),行 A 为:iter_type it=groupByMap.find(hashKey);
所以我会支付一个查找,计算哈希值。
B 行将是:it = groupByMap.insert(it, newHashElement);
所以我再次支付 一个查找,计算哈希值。
有没有办法只执行一次哈希计算?
答案 0 :(得分:1)
我认为groupByMap
为std::unordered_map<YOUR_KEY, YOUR_VALUE>
,其类型定义为YourMap
。
如果是这样,请执行:
std::pair<YourMap::iterator, bool> position =
groupByMap.emplace(hashKey, newHashElement);
if (!position.second)
{
// Insertion didn't occur, a key was already there, so just update contents.
YourUpdate(*position.first);
}
在上面的代码中,我使用了emplace()
std::unordered_map
方法。 groupByMap.emplace(hashKey, newHashElement)
基本上是groupByMap.insert(std::make_pair(hashKey, newHashElement))
,但没有创建临时对(它构建了对)。因此,如果您没有使用std::unordered_map
,但有其他类(例如stl::hash_map
,但没有emplace()
),则可以将emplace()
替换为insert()
如上所述,它可以正常工作。