Hash Aggregate on C ++

时间:2014-05-30 14:05:07

标签: c++ algorithm hash stl

我试图在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); 所以我再次支付 一个查找,计算哈希值。

有没有办法只执行一次哈希计算?

1 个答案:

答案 0 :(得分:1)

我认为groupByMapstd::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()如上所述,它可以正常工作。