是否建议不要将大型STL对象存储为std :: unordered_map作为值?

lwx*_*ted 2 c++ stl unordered-map hashtable trie

例如,请考虑以下trie实现.

struct Trie: unordered_map<char, pair<bool, Trie> >
Run Code Online (Sandbox Code Playgroud)

是否应该struct Trie存储指针?

struct Trie: unordered_map<char, pair<bool, Trie *> >
Run Code Online (Sandbox Code Playgroud)

由于struct Trie对象可能变得非常大,因此随着trie变大,第一次实现效率会降低吗?

在这里,管理内部内存alloc和dealloc Trie应该不会太麻烦,所以不考虑手动的麻烦,new / delete应该首选哪种实现?

Rei*_*ica 5

  1. 由于您显然有足够的C++ 11可供使用std::unordered_map,因此您应该强烈避免拥有原始指针.而不是pair<bool, Trie*>,使用pair<bool, unique_ptr<Trie>>.

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

  3. 公开继承标准库容器通常是一个坏主意; 它们不是为它而设计的,没有虚拟接口.喜欢成分.