【问题标题】:Traversal and Access via id implementation hash_map & vector通过 id 实现 hash_map & vector 的遍历和访问
【发布时间】:2012-09-17 12:41:18
【问题描述】:

我正在设计我的程序的核心,并有各种实体,我目前循环调用update()。我有大约十个 vectors 包含我的对象,尽管将来这可能会增长到更大的数量。我刚刚意识到我需要定期通过id 查找这些内容,因此我不得不遍历所有元素以查找正确的 id。

我正在考虑创建一个包含id 以及指向对象本身的指针的hashmap。这是最有效的方法吗? id 是半随机的,尽管它们只会在整个程序中增加,每个列表中的每个元素都有一个唯一的 id(每次分配一个 id 计数器都会增加)。向量中的元素现在经常被删除和添加。除了在 java 中的一小部分之外,我对 hashmap 的工作并不多,所以我不确定这是否是一条有效的途径。我相信代码仍然是可读的,但是除了 hash_map 之外还有什么更适合这个的选项吗?谢谢

【问题讨论】:

  • 这将有 O(1) 的查找时间,但不会像保持向量按 id 排序并使用二进制搜索那样节省内存。如果内存开销是一个问题,您可能想看看Boost.Containerflat_map<>
  • The elements in vectors now get removed and added often -- 这可能意味着将这些对象保留在向量中并不理想,除非您总是从向量的最末端移除。
  • @SevaTitov 我无法确定它们能持续多久,进出的吞吐量很大。一些早期的可能会持续几个小时,一些早期的可能会持续几秒钟。它认为拥有一个大向量并迭代所有空元素以试图减少这种情况是不可行的,因为迭代通常每秒发生 10->100 次。不过,我对效果并不积极(总是在学习),所以你可能会有所收获。

标签: c++ vector hashmap


【解决方案1】:

我不知道为什么你有 10 个vectors - 如果对象可以存储在一个排序的vector 中,你可以使用binary_search 来查找对象(记得在每次插入后对其进行排序)。

当然,hash_map 也可以使用,但会占用空间/内存。

【讨论】:

  • @ildjams 推荐,flat_map,似乎也很合适。它们是基于有序向量的关联容器 - 但是,如果您已经拥有 vectors,您可以维护自己拥有的那些。
  • 存在的原因是每个人都拥有不同类型的对象,但它们都使用相同的 id 系统。我想我可以创建一些只保存每个对象然后引用它的东西。但是现在我可以遇到每秒几百个插入和删除的情况,几千个对象,而且,插入有时会在每个循环中发生,有时不会持续几秒钟——这是我无法控制的。有数千个元素,我认为排序是不可行的。
猜你喜欢
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
相关资源
最近更新 更多