C++中的STL容器实际上是如何实现的..

abh*_*bhi 2 c++ stl

我被问到这个问题很多.我读过各种来源,包括Bjarne Stroustrup的书.它表示该标准并未要求对STL容器进行任何实施.但我还不清楚.如果实现没有授权,是否意味着在我的代码中使用向量或列表时,它可能在不同的时间使用不同的数据结构?如果是这样的话,如何决定在哪个时间使用哪种数据结构?我的意思是,如果不修复所有STL容器每次都会使用特定的DS?

mat*_*ort 10

该标准没有规定什么样的数据结构应该被用来实现STL容器,但它确实使复杂的保证,有时其他担保(如vector使用连续的内存)通常限制可以合理利用符合标准的实现中使用的数据结构的选择少数选择.


Sto*_*ica 6

它可能在不同的时间使用不同的数据结构?

是的,可能.但我们需要明确定义"不同的时间".如果使用标准库实现I为平台P编译它,那么只要运行该程序,它将使用相同的数据结构.如果更改P或I并重新编译,则可以使用其他数据结构."不同时间"由构建分隔.

如何决定在哪个时间使用哪种数据结构?

该标准强加了渐近复杂性要求,因此这是一个很大的标准.除此之外,实现者可以在满足这些要求的不同数据结构之间进行选择.由于实施者也了解平台,他们可能会选择在您构建的特定平台上表现更好的数据结构.

我的意思是,如果不修复所有STL容器每次都会使用特定的DS吗?

不.如果有人明天提出一个非常酷和高效的数据结构,那么可以完全满足并超出某些标准库容器的要求呢?如果数据结构在规范中设置固定,而不是复杂性,则不允许使用这种更好的实现.直到C++标准可能更新,这个过程可能需要数年时间.

软件工程是关于平衡规范和抽象.您必须指定解决问题所需的内容,并抽象出与解决方案无关的详细信息.如果过度指定,则会失去灵活性.但要注意不要过度抽象而失去性能.标准库是一个很好的案例研究,试图平衡两者.

  • `unordered_set`还具有迭代桶和提取节点的接口,因此它几乎被锁定为基于链的哈希表. (2认同)