【问题标题】:Is it advised against to store a large STL object into std::unordered_map as value?是否建议不要将大型 STL 对象作为值存储到 std::unordered_map 中?
【发布时间】:2014-07-10 14:14:47
【问题描述】:

例如,考虑下面的 trie 实现。

struct Trie: unordered_map<char, pair<bool, Trie> >

是否应该存储指向struct Trie 的指针?

struct Trie: unordered_map<char, pair<bool, Trie *> >

既然struct Trie 对象可以变得非常大,那么第一个实现会随着trie 变大而降低效率吗?

这里,管理Trie的内存分配和释放应该不会太麻烦,所以不考虑手动new / delete的麻烦,应该首选哪个实现?

【问题讨论】:

  • 如果不考虑“手动new/delete”的麻烦,如何回答这个问题?根据我的经验,这是通过 API 引起各种连锁反应的主要问题。
  • 但就纯粹的效率而言,应该首选哪种方法?
  • 从标准容器公开继承可能会在未来要求未定义的行为。
  • 当然,trie 不是哈希表......

标签: c++ stl hashtable unordered-map trie


【解决方案1】:
  1. 由于您显然有足够的 C++11 可用于使用 std::unordered_map,因此您应该强烈避免拥有原始指针。代替pair&lt;bool, Trie*&gt;,使用pair&lt;bool, unique_ptr&lt;Trie&gt;&gt;。

  2. 您根本不能使用第一种方法,因为 std::pair(和所有标准库容器)要求其模板参数是完整类型,这在您的情况下不正确 - Trie 尚未完全定义.

  3. 从标准库容器公开继承通常是个坏主意;它们不是为此而设计的,也没有虚拟界面。喜欢作曲。

【讨论】:

  • 感谢您的回答。你能解释一下第三点吗?在这种情况下,您所说的“偏好组合”是什么意思?
  • @lwxted 我的意思是你应该将地图存储在Trie 中,而不是从它继承。当然,这取决于您的特定用例。
猜你喜欢
  • 1970-01-01
  • 2014-07-05
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多