如何知道用于实现标准代码段的确切数据结构和算法,例如在C++STL中?



我想知道堆栈是如何在C++STL中实现的,使用数组或链表,或者更复杂的东西。另外,我如何知道,任何代码的任何标准片段是如何实现的?我已经尝试过谷歌搜索和编写自定义代码来获得想法,但这非常耗时,有时第三方网站不会显示任何有用的信息。

我想知道堆栈是如何在C++STL中实现的,使用数组或链表,或者更复杂的东西。

std::stack是一个容器适配器。它使用您提供的容器类型作为模板参数。默认情况下,它使用std::deque.

如何知道用于实现标准代码段的确切数据结构和算法,如C++STL?

通过阅读源代码或文档(如果有(。如果两者都不可用,那么您可以询问向您出售实施的供应商。如果这也不是一个选项,你可以尝试逆向工程(假设这对你来说是合法的(,但这个选项既不容易也不快速。

尽管该标准没有明确指定用于实现标准容器的数据结构,但它们的要求非常严格,以至于实现几乎没有选择的自由。在实践中:

  • std::list是用双链表实现的
  • std::forward_list.. 带有单向链表
  • std::vector.. 具有指数级增长的动态阵列
  • 毫不奇怪,std::array..带有数组
  • std::deque.. 使用分段数组
  • 有序关联容器是平衡搜索树
  • 无序关联容器是具有链式存储桶的哈希表。
  • std::queuestd::stack是按原样使用基础序列容器的容器适配器。
  • std::priority_queue是一个容器适配器,它在参数序列容器之上构建隐式二进制堆。
  • std::basic_string类似于 vector,只是它是以 null 结尾的,并且对迭代器的失效要求不那么严格,这允许实现对小型容器使用优化,其中元素存储在容器内存中而无需动态分配。

没有办法保证告诉你这些信息。#include <stack>可能会触发为您实现std::stack的魔术编译器设置。

但在实践中,#include <stack>将包含一个名为stack的文件,你可以去查看这个文件,并阅读你的特定标准库的实现。

请注意,此文件将难以阅读 - 代码首先针对正确性进行了优化,其次是性能,其次是易于阅读性。 它还必须应对用户代码可能#define许多符号的事实,因此所有变量都可能被称为_This

最新更新