【问题标题】:Why hasn't C++ standardized overloads of algorithms which operate on entire containers? [duplicate]为什么 C++ 没有标准化在整个容器上运行的算法重载? [复制]
【发布时间】:2021-03-03 06:59:51
【问题描述】:

标准 ISO C++ 拥有丰富的算法库,包括大量的语法糖,如 std::max_elementstd::fillstd::count 等。

我很难理解为什么 ISO 认为适合标准化许多此类琐碎的算法,而不是在整个容器上运行的算法的重载。

我真的不明白为什么当我们没有完整的容器版本(肯定是迄今为止最常见的情况)或类似地留下向量擦除-删除习语的暴行时,他们为什么要添加这些基本的东西:

v.erase(std::remove(v.begin(), v.end(), elem), v.end());

似乎我用 C++ 编写的每个项目最终都会包含我自己的自定义头文件,其中包含类似这样的基本语法糖。

当然,任何微不足道的整个容器重载都可以包含在自定义标头中。许多标准化的简单算法也是如此。

我试图理解的是,为什么标准中有充分的理由,例如 std::max_elementstd::fill 范围内的东西,而不是在整个容器上运行的版本,或者其他减少冗长的语法糖编写 C++ 代码。

【问题讨论】:

  • 我不能说为什么我们以前没有它,但我们现在(大部分)有了它:en.cppreference.com/w/cpp/ranges
  • 当你想在容器的子范围上运行这些算法时怎么办?看来您基本上是要求通过为每个需要一个范围的函数添加一个完整容器版本来将库的算法部分中的函数数量加倍。 (对于那些需要两个范围的人来说是四倍)
  • 这样设计的基本原理可以写满整本书。事实上,Alexander Stepanov 就是这样做的(因为您标记了这个 STL)。
  • 看起来规范的 target 需要更新。
  • @cigien 或多或少是个骗子,不是吗?好的,OP 询问原因,但只能在此处以基于意见的方式回答。

标签: c++ stl standardization


【解决方案1】:

这已在 C++20 中得到纠正

查看cppreference 上的一个示例

template< ranges::input_range R, class Proj = std::identity,
          std::indirect_unary_predicate<std::projected<ranges::iterator_t<R>, Proj>> Pred >
constexpr ranges::range_difference_t<R>
  count_if( R&& r, Pred pred = {}, Proj proj = {} );

bool is_even(int n) {
   return (n % 2 == 0);
}
std::vector<int> l(10);
std::iota(l.begin(), l.end(), 0); // is in numerics which hasn't been rangified.

auto cnt = std::ranges::count_if(arr, is_even);

【讨论】:

  • std::ranges::iota_view
【解决方案2】:

为什么 C++ 没有标准化在整个容器上运行的算法重载?

答案与对所有此类问题的回答相同:此类重载尚未标准化,因为此类更改尚未提出或此类提议尚未被接受。原来的 STL 没有这样的重载。

answer 到一个类似问题的链接到一个blog post,它有一个论据,说明为什么这种重载对于某些算法会有问题,这可能是这种重载不是原始设计的一部分的部分原因,也不是后面已经介绍过了。简而言之,它们会引入歧义和误导性错误消息。


然而,C++ 没有重载,但自 C++20 以来,在单独的命名空间 std::ranges 中的完整范围具有相同的算法。使用填充的示例:

std::ranges::fill(container, value);

暴行,即矢量擦除-删除成语

虽然范围不会引入新的成员函数重载,但有一个非成员替代方法来擦除:

std::erase(vector, elem);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 2021-02-14
    • 1970-01-01
    • 2011-09-14
    • 2014-05-20
    • 1970-01-01
    • 2019-03-19
    相关资源
    最近更新 更多