计算unordered_map范围内出现次数

时间:2016-11-06 04:57:32

标签: c++ hash hashmap unordered-map

我将我的unordered_map设置为:

unordered_map<int, deque<my_struct>> table;

当我读取我的程序的值时,我通常会这样做:

 table[int].push_back(obj);

我想要做的是,如果给出2个整数变量,我希望能够找到两者之间出现的键数。

因此,如果在我的表中我有像

这样的代码
  table[49].push_back(obj);
  table[59].push_back(obj);
  table[60].push_back(obj);

如果我执行我的搜索功能(我正在尝试编写)来查看45和65之间的键值,我应该得到3个结果。

我不确定如何以有效的方式解决这个问题。任何想法都会有所帮助。比你。

1 个答案:

答案 0 :(得分:1)

如果您使用的是std::unordered_map,我认为您可以选择循环使用45到65之间的所有整数,并使用find检查unordered_map中是否存在密钥1}}:

using my_table = std::unordered_map<int, std::deque<my_struct>>;

int count(const my_table& table, int begin, int end) {
  int sum = 0;
  for (int i = begin; i != end; ++i) {
    auto find_result = table.find(i);
    if (find_result != table.end())
        sum++;
  }
  return sum;
}

但这可能效率不高。如果您使用std::map而不是订购元素,那么可以更有效地实现这一目标:

using my_table = std::map<int, std::deque<my_struct>>;

int count(const my_table& table, int begin, int end) {
  auto begin_itr = table.lower_bound(begin);
  if (begin_itr == table.end())
      return 0;
  auto end_itr = table.lower_bound(end);
  return std::distance(begin_itr, end_itr);
}

我已使用std::map::lower_bound功能。

根据地图的稀疏程度,您甚至可以考虑使用std::vector<std::deque<my_struct>>等平面地图。

Live demo