应该何时使用STL算法而不是使用自己的算法?

时间:2010-07-06 17:44:50

标签: c++ algorithm stl

我经常使用STL容器,但从未使用过与STL容器一起使用的STL算法。

使用STL算法的一个好处是它们提供了一种删除循环的方法,从而降低了代码逻辑的复杂性。我还没有列出其他好处。

我从未见过使用STL算法的C ++代码。从网页文章中的示例代码到开源项目,我还没有看到它们的用途。

它们的使用频率是否超出预期?

13 个答案:

答案 0 :(得分:71)

简短回答:永远。

答案很长:总是。这就是他们的目的。它们针对STL容器进行了优化,与您自己编写的任何东西相比,它们更快,更清晰,更惯用。您应该考虑自己编写的唯一情况是,如果您能够阐明STL算法不满足的非常具体的任务关键需求。

编辑添加:(好吧,所以不是真的真的总是,但如果你不得不问你是否应该使用STL,答案是肯定的。)

答案 1 :(得分:17)

你已经得到了很多答案,但我真的不同意他们中的任何一个。有些人非常接近标记,但未提及关键点(IMO,当然)。

至少在我看来,关键点很简单:当你帮助澄清你正在编写的代码时,你应该使用标准算法。

真的那么简单。在某些情况下,您正在做的事情需要使用std::bind1ststd::mem_fun_ref(或该命令中的某些内容)进行奥术调用,这种调用非常密集且不透明,其中for循环几乎是简单而直接。在这种情况下,请继续使用for循环。

如果没有标准算法可以做你想做的事情,那就小心一点,再看看 - 你经常会错过一些真正能做你想做的事情(一个经常错过的地方:{{1中的算法通常用于非数字用途)。看了几次,并确认确实不是标准算法来做你想要的,而不是写内联<numeric>循环(或其他),考虑编写通用算法做你需要做的事。如果你在一个地方使用它,很有可能你可以使用它两三个,这时它可以是一个明显的大胜利。

编写通用算法并不是那么难 - 实际上,与编写内联循环相比,它通常几乎没有额外的工作,所以即使你只能使用它两次,你已经节省了一点点工作,即使你忽略了代码可读性和清晰度的改进。

答案 2 :(得分:15)

只要符合您的需要,就应该使用STL算法。这几乎一直都是。

答案 3 :(得分:13)

  

何时应该使用STL算法而不是使用自己的算法?

当你重视时间和理智,并且有更多有趣的事情要做,而不是一次又一次地重新发明轮子。

当项目需要时,您需要使用自己的算法,并且没有可接受的替代方法来自行编写内容,或者您​​将STL算法识别为瓶颈(当然使用分析器),或者具有某种限制STL不符合,或适应STL的任务将花费比从头编写算法更长的时间(我不得不使用扭曲版本的二进制搜索几次......)。 STL并不完美,不适合一切,但是当你可以的时候,你应该使用它。当有人已为你完成所有工作时,经常没有理由再做同样的事情。

答案 4 :(得分:8)

我编写性能关键应用程序。这些是需要在尽可能快的时间内处理数百万条信息的事物。如果不是STL,我将无法完成我现在所做的一些事情。永远使用它们。

答案 5 :(得分:6)

除了像std::foreach这样的东西外,还有许多优秀的算法。

然而,有许多非平凡且非常有用的算法:

  • 排序:std::sortstd::upper_boundstd::lower_boundstd::binary_search
  • 最低/最高std::maxstd::minstd::partitionstd::min_elementstd::max_element
  • 搜索std::findstd::find_first_of

还有很多其他人。

std::transform这样的算法对于C ++ 0x lambda表达式或boost::lambdaboost::bind

之类的东西非常有用

答案 6 :(得分:3)

如果我今天下午必须写一些东西,并且我知道如何使用手工制作的循环,并且需要弄清楚如何在STL算法中进行,我会用手工制作的循环来编写它。 / p>

话虽如此,我会努力使STL算法成为我工具包的可靠部分,原因在于其他答案。

-

您可能没有在代码中看到它的原因是它是遗留代码或由遗留程序员编写。在STL出现之前,我们有大约20年的C ++编程,在那时我们有一个程序员社区,他们知道如何以旧方式做事并且尚未学习STL方式。这可能会持续一代人。

答案 7 :(得分:2)

我不使用STL算法的唯一时间是跨平台实现差异影响我的程序的结果。这只发生在一两种罕见的情况下(在Playstation 3上)。虽然STL的接口是跨平台标准化的,但实现并非如此。

此外,在某些极高性能的应用程序中(想想:视频游戏,视频游戏服务器),我们用自己的STL结构取代了一些STL结构,以提高效率。

然而,绝大多数时间使用STL是要走的路。在我的其他(非视频游戏)工作中,我专门使用STL。

答案 8 :(得分:2)

直到现在STL算法的主要问题是,即使算法调用本身更清晰,定义你需要传递给它们的仿函数会使你的代码更长更复杂,因为语言的方式强迫你这样做。 C ++ 0x预计会改变它,因为它支持lambda表达式。

在过去的6年里,我一直在大量使用STL,尽管我尝试在任何地方使用STL算法,但在大多数情况下,它会使我的代码更加模糊,所以我回到了一个简单的循环。现在使用C ++ 0x相反,代码似乎总是看起来更简单。

问题在于,到目前为止,C ++ 0x支持仅限于少数编译器,即使因为标准尚未完全完成。因此,我们可能需要等待几年才能真正看到STL算法在生产代码中的广泛使用。

答案 9 :(得分:1)

请记住,STL算法涵盖了很多基础,但是大多数C ++开发人员可能最终编写的代码几乎与每个std::find()std::find_if()std::max()相同。他们的工作日(如果他们还没有使用STL版本)。通过使用STL版本,您将算法与代码的逻辑流程和数据表示分离

对于其他不常用的STL算法,例如std::merge()std::lower_bound(),这些是非常有用的例程(第一个用于合并两个已排序的容器,第二个用于计算在容器中插入项目的位置)保持秩序)。如果你试图自己实现它们,那么它可能需要几次尝试(算法并不复杂,但你可能会得到一个错误或类似的东西)。

我自己每天都在职业生涯中使用它们。一些早于稳定STL的遗留代码库可能不会广泛使用它,但如果有一个新项目有意避开它,我倾向于认为它是由一个兼职的黑客仍然在90年代中期假设模板很慢,因此要避免使用。

答案 10 :(得分:1)

我不会在两种情况下使用STL:

  1. 当STL不适合您的任务时。 STL几乎是一般用途的最佳选择。但是,对于特定应用,STL可能并不总是最好的。例如,在我的一个程序中,我需要一个巨大的哈希表,而STL / tr1的hashmap等价需要占用太多内存。

  2. 在学习算法时。我是少数几个喜欢重新发明轮子并在这个过程中学到很多东西的人之一。对于该程序,我重新实现了一个哈希表。这真的花了我很多时间,但最终所有的努力都得到了回报。我学到了很多东西,这些东西对我未来作为程序员的职业生涯大有裨益。

答案 11 :(得分:1)

如果你认为你可以比一个非常聪明的编码员更好地编码,他们花费数周时间研究和测试并试图应对所有可能的输入。

对于大多数地球人来说,答案绝对不是!

答案 12 :(得分:-2)

  

它们的使用频率是否超出预期?

我从未见过它们被使用过;除了书籍。也许它们被用于实现STL本身。也许它们会变得更有用,因为它们更容易使用(例如参见Lambda functions and expressions),甚至在下一版C ++中被淘汰(例如参见Range-based for-loop)。