我想知道堆栈是如何在C++STL中实现的,使用数组或链表,或者更复杂的东西。另外,我如何知道,任何代码的任何标准片段是如何实现的?我已经尝试过谷歌搜索和编写自定义代码来获得想法,但这非常耗时,有时第三方网站不会显示任何有用的信息。
我想知道堆栈是如何在C++STL中实现的,使用数组或链表,或者更复杂的东西。
std::stack
是一个容器适配器。它使用您提供的容器类型作为模板参数。默认情况下,它使用std::deque
.
如何知道用于实现标准代码段的确切数据结构和算法,如C++STL?
通过阅读源代码或文档(如果有(。如果两者都不可用,那么您可以询问向您出售实施的供应商。如果这也不是一个选项,你可以尝试逆向工程(假设这对你来说是合法的(,但这个选项既不容易也不快速。
尽管该标准没有明确指定用于实现标准容器的数据结构,但它们的要求非常严格,以至于实现几乎没有选择的自由。在实践中:
std::list
是用双链表实现的std::forward_list
.. 带有单向链表std::vector
.. 具有指数级增长的动态阵列- 毫不奇怪,
std::array
..带有数组 std::deque
.. 使用分段数组- 有序关联容器是平衡搜索树
- 无序关联容器是具有链式存储桶的哈希表。
std::queue
和std::stack
是按原样使用基础序列容器的容器适配器。std::priority_queue
是一个容器适配器,它在参数序列容器之上构建隐式二进制堆。std::basic_string
类似于 vector,只是它是以 null 结尾的,并且对迭代器的失效要求不那么严格,这允许实现对小型容器使用优化,其中元素存储在容器内存中而无需动态分配。
没有办法保证告诉你这些信息。#include <stack>
可能会触发为您实现std::stack
的魔术编译器设置。
但在实践中,#include <stack>
将包含一个名为stack
的文件,你可以去查看这个文件,并阅读你的特定标准库的实现。
请注意,此文件将难以阅读 - 代码首先针对正确性进行了优化,其次是性能,其次是易于阅读性。 它还必须应对用户代码可能#define
许多符号的事实,因此所有变量都可能被称为_This