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

How to know, the exact data structures and algorithms used to implement a standard piece of code, like in C++ STL?

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

I wanted to know how the stack is implemented in C++ STL, using array or linked-list, or something even more sophisticated.

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

How to know, the exact data structures and algorithms used to implement a standard piece of code, like in 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