代码之家  ›  专栏  ›  技术社区  ›  Paul Kelly

什么时候应该使用STL算法而不是使用自己的算法?

  •  31
  • Paul Kelly  · 技术社区  · 14 年前

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

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

    13 回复  |  直到 14 年前
        1
  •  74
  •   David    14 年前

    简而言之:永远。

    答案很长:总是。他们就是为了这个。它们是优化的,用于STL容器,而且它们比任何你自己写的都快,更清晰,更习惯。你应该考虑滚动自己的唯一情况是,如果你能明确地表达STL算法不能满足的非常具体的、关键任务的需求。

    真正地

        2
  •  18
  •   Jerry Coffin    14 年前

    你已经得到了很多答案,但我不能完全同意其中任何一个。有一些非常接近于标准,但没有提到关键点(当然是IMO)。

    你在写作。

    其实就这么简单。在某些情况下,您所做的需要使用 std::bind1st std::mem_fun_ref (或类似的东西)非常密集和不透明,其中 for 对于 循环。

    如果没有一个标准的算法可以做你想做的事情,那就要多加小心,再看一遍——你经常会错过一些真正可以做你想做的事情(一个经常错过的地方是:中的算法) <numeric> 真正地 不是一个标准的算法来做你想做的,而不是写 对于 内联循环(或其他),考虑编写一个通用算法来完成您需要完成的任务。如果你只在一个地方使用它,那么你很有可能再使用两三次,在这一点上,它可以在清晰性方面大获全胜。

        3
  •  15
  •   cHao    14 年前

    STL算法应该在适合您需要做的任何时候使用。这几乎是所有的时间。

        4
  •  13
  •   SigTerm    14 年前

    什么时候应该使用STL算法而不是使用自己的算法?

    当你珍惜你的时间和理智,做比一次又一次地重新发明轮子更有趣的事情时。

        5
  •  8
  •   wheaties    14 年前

    我编写性能关键型应用程序。这些都是需要在尽可能快的时间内处理数百万条信息的事情。如果不是STL,我就不能做我现在做的一些事情。经常使用它们。

        6
  •  6
  •   Artyom    14 年前

    除了像这样的东西,还有很多好的算法 std::foreach .

    • 排序: std::sort , std::upper_bound std::lower_bound , std::binary_search
    • std::max , std::min , std::partition , std::min_element std::max_element
    • std::find , std::find_first_of 等。

    还有很多其他的。

    算法如 std::transform boost::lambda boost::bind

        7
  •  3
  •   JohnMcG    14 年前

    --

    您可能无法在代码中看到它的原因是,它要么是遗留代码,要么是由遗留程序员编写的。在STL问世之前,我们有大约20年的C++编程,在那时我们有一个程序员群体,他们知道如何用老方法做事,还没有学会STL方式。这种情况可能会持续一代人。

        8
  •  2
  •   Tyler    14 年前

    我唯一不使用STL算法的时候,就是跨平台实现的差异影响了我的程序的结果。这只发生在一两个罕见的案例中(在PlayStation3上)。虽然STL的接口是跨平台标准化的,但是实现不是。

    另外,在某些高性能的应用程序(比如视频游戏、视频游戏服务器)中,我们用自己的STL结构替换了一些STL结构,以寻求更高的效率。

    然而,绝大多数时间使用STL是可行的。在我的其他(非视频游戏)工作中,我只使用STL。

        9
  •  2
  •   the_mandrill    14 年前

    std::find() std::find_if() std::max() 他们几乎每天都在工作(如果他们还没有使用STL版本的话)。通过使用STL版本

    对于其他不太常用的STL算法,例如 std::merge() std::lower_bound() 这些是非常有用的例程(第一个用于合并两个已排序的容器,第二个用于确定在容器中的何处插入项以保持其有序)。如果你尝试自己实现它们,那么可能需要几次尝试(算法并不复杂,但是你可能会因为一个错误或者类似的错误而成功)。

    在90年代中期的假设下工作的模板是缓慢的,因此要避免。

        10
  •  2
  •   Fabio Ceconello    14 年前

    现在的问题是,C++的0x支持仍然局限于几个编译器,即使标准还没有完全完成。所以我们可能要等几年才能真正看到STL算法在生产代码中的广泛应用。

        11
  •  1
  •   user172818    14 年前

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

        12
  •  1
  •   James Anderson    14 年前

    当你认为你可以更好地编码它比一个真正聪明的程序员谁花费数周的研究和测试,并试图应付每一个可以想象的输入集。

    对大多数地球人来说,答案是永远不会!

        13
  •  -4
  •   ChrisW    14 年前

    它们的使用频率是否比看上去的要高?

    Lambda functions and expressions ),甚至被淘汰(参见 Range-based for-loop ),在下一个版本的C++中。