【问题标题】:Why don't std::find_if and related functions have overloads for the whole container? [duplicate]为什么 std::find_if 和相关函数没有整个容器的重载? [复制]
【发布时间】:2017-04-21 06:53:31
【问题描述】:
std::vector<int> vec;
std::find_if(vec.begin(), vec.end(), X);
where X = function or lambda expression

以上是我们今天在 C++ 中所拥有的。大多数时候,在这样的 函数,我们总是遍历整个容器。为什么不这些 功能支持 -

std::find_if(vec, X) where X = function or lambda expression

除非我没有正确搜索,否则我在 C++17 中看不到这一点。 有没有人正在开发类似的东西……也许是 C++20?

【问题讨论】:

  • 它已经进行了多年,但似乎他们无法就任何事情达成一致。我同意缺少范围库真的很糟糕。
  • 这被称为“基于容器的算法”。见this question

标签: c++ stl


【解决方案1】:

我觉得应该也加了。
boost.range有,所以技术上没有理由不支持。
不幸的是 boost.range 有点落后,所以我使用的版本不支持std::any_of 系列。如果标准库已经支持范围,这将不是问题。

【讨论】:

    【解决方案2】:

    我不是委员会成员,不知道是否有技术原因(sort(container, comparator)sort(it_begin, it_end) 之间的歧义是一个问题,但很容易解决),但答案通常是没有人提出提出这些重载并通过标准化过程与之抗争的实际论文。

    虽然范围的 TS 增加了这样的重载。我不敢猜测,什么时候会出现在主要标准中,或者通用工具链什么时候会提供它们。

    无论如何,自己编写这些版本非常简单,因此,如果您不想使用 boost 或等待范围 TS,您可以坐下来,一次编写所有重载,然后在未来,或者只是在每次需要时向集合中添加一个算法,让您的集合有机增长。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-03
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      相关资源
      最近更新 更多