我被问到这个问题很多。我读过各种来源,包括Bjarne Stroustrup的书。它表示该标准并未要求对STL容器进行任何实施。但我还不清楚。如果实现没有授权,是否意味着在我的代码中使用向量或列表时,它可能在不同的时间使用不同的数据结构?如果是这样的话,如何决定在哪个时间使用哪种数据结构?我的意思是,如果不修复所有STL容器每次都会使用特定的DS?
答案 0 :(得分:10)
标准没有规定应该使用哪些数据结构来实现STL容器,但它确实提供了复杂性保证,有时还提供其他保证(如使用连续内存的vector
),这通常会限制数据结构的选择。合理的实施可以合理地用于少数选择。
答案 1 :(得分:6)
它可能在不同的时间使用不同的数据结构?
是的,可能。但我们需要明确定义“不同的时间”。如果使用标准库实现I为平台P编译它,那么只要运行该程序,它将使用相同的数据结构。如果更改P或I并重新编译,则可以使用其他数据结构。 “不同时期”由构建分开。
如何决定在哪个时间使用哪种数据结构?
该标准规定了渐近复杂性要求,因此这是一个很重要的标准。除此之外,实现者可以在满足这些要求的不同数据结构之间进行选择。由于实施者也了解平台,他们可能会选择在您正在构建的特定平台上表现更好的数据结构。
我的意思是,如果不修复所有STL容器每次都会使用特定的DS吗?
没有。如果有人明天会提出一个非常酷的高效数据结构,那么可以完全满足并超出某些标准库容器的要求呢?如果数据结构在规范中设置固定,而不是复杂性,则不允许使用这种更好的实现。直到C ++标准可能更新,这个过程可能需要数年时间。
软件工程是关于平衡规范和抽象。您必须指定解决问题所需的内容,并抽象出与解决方案无关的详细信息。如果过度指定,则会失去灵活性。但要注意不要过度抽象而失去性能。标准库是一个很好的案例研究,试图平衡两者。