【问题标题】:vector of list. Should I use pointers or values?列表的向量。我应该使用指针还是值?
【发布时间】:2013-04-20 02:44:33
【问题描述】:

我正在实现数据结构哈希表,其中使用链解决冲突。

因此,作为基础数据结构,我需要列表向量
我从 2 个变体中进行选择:

  • std::vector<std::list<entry> >
  • std::vector<std::list<entry>* >

其中 entry 是包含数据和哈希值的结构体;

问题:如果我使用第一个变体(问题是在大输入数据上考虑的),效率会大大降低吗?

提前谢谢你!

【问题讨论】:

  • 需要实现哈希表吗? C++11 有 std::unordered_set 和 std::unordered_map (以及它们的“多”对应物)。
  • 是的,这是为了教育目的。
  • 不要使用std::list<entry>,除非您从列表中间插入/删除元素的次数比您对其进行迭代的次数多,或者如果entry 是不可移动且昂贵的复制,或昂贵的移动。 std::liststd::"双向链表",而不是 std::"当你想要一个事物列表时使用的理想容器"。

标签: data-structures c++11 stl hashtable


【解决方案1】:

使用指针确实没有任何优势,而且它增加了在销毁向量时需要删除的复杂性。继续使用vector<list<entry> >list 无论如何都会为元素分配内存,但它对你是不可见的。

如果必须调整向量的大小,可能会降低性能,但 C++11 编译器应该使用移动而不是复制来最小化它。对于学习项目,性能不应该是您首先关心的问题。

【讨论】:

  • 我在您的回答中发现了非常有用的信息,即 STL 容器向量在堆中为其元素分配内存。该信息使我推断在效率的情况下 2 个变体会有细微的差异,并且由于 2-nd 需要做更多的工作(内存分配/释放),我将选择 1-st。非常感谢!
【解决方案2】:

唯一真正的区别是,第一种方法的存储桶/链中的条目将存储在堆栈中,而第二种方法的条目将存储在堆中。对于大型结构,我发现在堆上存储通常更好,但这值得商榷。真的,只要在将条目添加到列表时记得更新条目,就可以了。

【讨论】:

  • 这个答案不正确。在这两种情况下,除了std::vector 内部之外的所有内容都将始终从免费存储中分配。
  • 当我阅读 Mark Ransom 的答案时,我意识到在这两个变体中,链(列表)由于向量实现而将存储在堆栈中。
  • @spin_eight:不。std::vector 总是在免费存储中分配其内容,马克的回答中没有任何其他建议。
  • -1。我认为您将连续存储与堆栈存储混淆了。此外,使用原始指针比仅仅更新条目要复杂得多。事实上,在您必须处理的所有问题中,“记住”新元素是最少的,因为如果您忘记了,代码甚至无法编译。相比之下,如果您在完成后忘记 delete 项目,或者如果您将指针复制到其他数据结构并忘记 not 到 @,编译器根本不会抱怨987654323@他们从向量中删除时。
  • @Marcelo Cantos 是的,我确实打错了——当然是在堆中,而不是在堆栈中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 2014-12-09
  • 1970-01-01
  • 2023-03-09
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多