STL的发现背后有什么算法?

时间:2011-03-21 20:44:02

标签: c++ algorithm stl find

我刚为地图中的字符串创建了自定义查找功能。我开发了某种线性搜索算法(我后来发现)并且不满意函数的速度。所以我搜索了一个更快的函数并找到了map自己的函数: map :: find

这比我使用的线性算法快得多。

在另一个例子中,STL的函数 find 也比我正在使用的另一个线性函数快得多。

但这怎么可能?如果你使用二进制搜索算法,你需要首先对地图进行排序,这将(假设)更多的时间,你的地图越大。

另外如何找出这些核心功能背后的算法?是否有列表或某种数据库可以找到它?

感谢您的所有答案!我赞成了最佳答案并接受了Max Lybbert的答案,因为它是最详细的答案。

保罗:)

5 个答案:

答案 0 :(得分:13)

std::map以排序顺序存储其元素(几乎总是在自平衡二叉搜索树中)。

std::map::find利用此优势并使用dichotomic search

答案 1 :(得分:9)

  

我开发了某种线性搜索算法(我后来发现)并且不满意函数的速度。所以我搜索了一个更快的函数并找到了map自己的函数:map::find.

     

这比我使用的线性算法快得多。

std::map旨在使数据在插入容器时保持排序。这是它的主要工作之一。这也是您必须为放入std::map的数据定义某种部分排序的原因。

这意味着每次插入比插入其他容器(插入std::list - 一旦你有插入点 - 需要更长的时间 - 例如是O(1),就像附加到{{ 1}}或附加/前置std::vector)。但查找保证使用二进制搜索(或者更确切地说,使用navigate the red-black tree behind the std::map(在“过早或谨慎优化”下)。

  

在另一个例子中,STL的函数find比我正在使用的另一个线性函数快得多。

     

但这怎么可能?如果你使用二进制搜索算法,你需要首先对地图进行排序,这将(假设)更多的时间,你的地图越大。

没有任何假设。对数据进行排序需要花费时间,并且总是需要更多时间来处理更多数据项。

std::deque能够处理未分类的数据,因此必须将其实现为线性搜索(比较std::find / std::binary_search)。但std::lower_bound允许偷偷摸摸地展开循环,一次比较多个项目(如果项目很小,特别是如果它们是原始类型,适合低级别的小提琴),等等。

  

另外如何找出这些核心功能背后的算法?是否有列表或某种数据库可以找到它?

就个人而言,我通过阅读STL和其他一些语言中提供的内容学到了很多算法。我发现首先研究容器更容易。

答案 2 :(得分:3)

从技术上讲,没有这样的算法。该标准定义了每个算法的执行情况,而不是它应该如何执行。每个编译器都附带标准库的实现。

也就是说,有STL的免费实现。你可以看看他们的代码。例如,STL Port

  

另外如何找出这些核心功能背后的算法?是否有列表或某种数据库可以找到它?

嗯,有Dictionary of Algorithms and Data Structures,但它有点乱。

答案 3 :(得分:2)

实施很好,依赖于实现。

但就通用复杂性类而言,您可以查看此页面,其中包含常见STL方法的概述:

http://www.cplusplus.com/reference/stl/

答案 4 :(得分:2)

STL算法几乎总是比你自己编写的任何算法都要快,因为它可以进行大量的优化。迭代通过向量或其他随机访问容器时,使用迭代器比使用运算符[]更快,因为开销更少。

你应该查看Scott Meyers的书籍Effective C ++ Third Edition和Effective STL。 (更有效的C ++中的材料包含在Effective C ++的第3版中。)