【问题标题】:quickest way to get all the unique mapped values in a std::map在 std::map 中获取所有唯一映射值的最快方法
【发布时间】:2012-02-21 08:36:28
【问题描述】:

我有这样一张地图:

std::map<time_t, int>

每天 (time_t) 有一个值 (int)。有些日子可能具有相同的价值,因此可能不是唯一的。我需要为此映射中的每个唯一 int 值执行计算。

检索它们的最快(CPU 使用率最低)方法是什么?

【问题讨论】:

  • 是否允许将std::map 更改为不同的数据结构?
  • @LuchianGrigore,当然为什么不。只要我不丢失任何数据。
  • “最快”的答案会有所不同,具体取决于(除其他外)每次修改主 map 需要多少次获取唯一整数。如果该数字很大,那么您应该为值维护一个集合(单独的multiset,单独的map&lt;int, size_t&gt; 以保持计数,或者使用Boost.MultiIndex,并且在每种情况下都可以订购集合/映射或无序)。如果这个数字足够小,那么避免每次地图修改的开销会更快,并且每次需要它们时只需将值复制到新集合或 unordered_set 中。
  • @SteveJessop,感谢您提供有关性能的提示。对的数量相对较少

标签: c++ performance stdmap


【解决方案1】:

你有内存限制吗? 如果没有,我会保留一个 std::set(或您的环境中可用的任何 hash_set)列出唯一整数。

如果你绝对不能分配更多的内存,也许你应该首先考虑使用不同的数据结构。

【讨论】:

  • 假设内存不是问题。我将如何记录这些日子?
  • 保留您的原始数据结构,并增加一个。第二种数据结构有两个选项:(a)保留一个 std::set ,它只列出唯一整数的哪些值(如果这就是你所需要的)。 (b) 保留一个 std::map,列出给定值出现的所有日期。
  • 并且每当您插入原始地图时,也插入到支持的数据结构中。
  • 如果你保留一个set 的值,那么当你从原始map 中删除一个元素时,你会如何处理它?
  • 如果发生这种情况,您必须坚持使用选项 2(保留“双向地图” - 因此您有一个为每个值映射的日期列表/集,然后从中删除,完全删除该值如果它出现的所有日期都被删除)。
猜你喜欢
  • 2016-07-02
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
  • 2012-11-11
  • 2018-09-22
  • 2023-01-12
  • 1970-01-01
  • 2022-01-06
相关资源
最近更新 更多