【问题标题】:Doubly Linked-List, Linked-lists and dynamic arrays in C++C++ 中的双向链表、链表和动态数组
【发布时间】:2018-01-01 08:02:21
【问题描述】:

我是 C++ 新手,可能这些问题是如此简单和基本 [对此感到抱歉!]。这里我有两个基本问题:

  1. 据我所知,C++ 中的向量是动态数组。他们可以通过将后/前元素推入其中来改变大小。

    我的问题是:向量是动态分配的,还是因为大小能力的变化而仅仅调用了“动态数组”名称? 动态分配数组和动态数组让我彻底 糊涂了!

  2. STL 列表是 C++ 中的链表(同样,据我所知)。这些是双向链表还是单链表?

谢谢,

【问题讨论】:

  • std::vectorstd::liststd::forward_list 的一个很好的参考可能会有用。
  • 1.通常,vector 是静态分配的,但包含一个动态分配的数组。 vector 的方法管理这个动态数组,以便您根据需要调整和释放动态数组。您可以动态分配vector,但这不符合要点;您现在必须手动管理旨在为您管理内存的数据结构的内存。 2. list 可能分配为双向链表,但这不是必需的。

标签: c++ list vector stl


【解决方案1】:

向量是动态分配的,正如您在提到的documentation 中看到的那样。您可以在push_back 函数中更好地看到这一点:

如果新的 size() 大于 capacity() 则所有迭代器和引用(包括过去的迭代器)都将失效。否则只有过去的迭代器无效。

另外,记住它的复杂性是摊销常数(例如,你可以看到this)。

更多信息(在cmets中提到),你可以找到真正的名单forward_list

它被实现为单链表,与在 C 中的实现相比,它基本上没有任何开销。与 std::list 相比,此容器在不需要双向迭代时提供更节省空间的存储。

另外,正如documentation 中提到的,列表被实现为双向链表。

列表容器被实现为双向链表;双向链表可以将它们包含的每个元素存储在不同且不相关的存储位置。排序是通过与每个元素的关联来保持内部的,该链接指向它之前的元素和指向它后面的元素的链接。

【讨论】:

【解决方案2】:
  1. 是动态分配向量还是仅仅调用“动态数组”名称是因为可以改变大小的能力?

据我所知,向量被称为动态数组,因为它们的大小可以在运行时改变。但实际上,它们是动态分配数组的。

  1. STL 列表是 C++ 中的链表(同样,据我所知)。这些是双向链表还是单链表?

两者兼而有之。 list 是双链接的,slist 是单链接的。将单链表引入标准库时,使用名称 std::forward_list 代替 slist(与 STL 版本略有不同)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    相关资源
    最近更新 更多