为什么std :: algorithms也不直接在容器上工作?

Sam*_*rsa 6 c++ algorithm

可能重复:
STL算法将整个容器而不是.begin(),end()作为arg?

我一直在研究一些算法,我想知道为什么它们中的一些还没有容纳容器的变体.

例如,find可以在一个容器中和值和所述算法可以在内部迭代器在容器通过调用beginend所述容器的.与unique_copy传递容器和算法使用似乎更有用的地方相同,push_back而不是需要迭代器,我将被迫将数组的大小调整为最大元素数.for_each是另一个这样的例子.

我相信我不知道有充分的理由吗?

Die*_*ühl 13

我可以看到两个主要原因:

  1. 为容器添加重载会使函数数量增加一倍以上:对于只采用一个范围的每个算法,重载将加倍.但是,对于像std::copy()你有两个范围的东西,每个范围都要独立地指定为范围(适当的抽象不是容器,BTW,而是游侠)或一对迭代器,使它已经4次重载.
  2. 一旦范围进入图片,就不完全清楚需要返回什么.您的示例使用std::find()它在将迭代器作为参数时显然返回迭代器.给定范围时,返回另一个范围实际上可能更合理.更糟糕的是,除非你最初有一个通过范围(例如,从流中读取的东西),否则甚至可以选择两个不同的范围,即开始找到对象,找到对象结束.另一个维度可以是获取所选范围的副本而不是迭代器分隔的范围的选择.

当最初提出STL时,它首先被认为是Crazy Talk!试图说服人们打开另一种主要的蠕虫来正确处理范围可能很容易扼杀整个想法.然后立即采取的后续问题就是:为什么这不会改变?......这个问题也有两个答案:

  1. 虽然草案版本在我提交给图书馆工作组时被认为是合理的,但我没有提出改变的界面.然而,我概述的提案没有得到很大的热情.此外,当时我不知道如何实际实现我设想的可接受的努力的界面(使用C++ 2011功能,我知道如何做到这一点).我已经开始写一个STL新接口的描述,但即便这样也不完整,我最近没有花时间去处理这个问题.
  2. 虽然算法在我看来是正确的方法,但许多人故意不使用它们.我发现人们已经取代了算法的使用情况,因为据说编写循环执行操作比调用算法更"可读".不幸的是,在某些情况下,这确实是正确的,因为所涉及的功能对象只是丑陋的.鉴于很少有人似乎使用算法,似乎没有动力去改变它们.