【发布时间】:2021-03-03 06:59:51
【问题描述】:
标准 ISO C++ 拥有丰富的算法库,包括大量的语法糖,如 std::max_element、std::fill、std::count 等。
我很难理解为什么 ISO 认为适合标准化许多此类琐碎的算法,而不是在整个容器上运行的算法的重载。
我真的不明白为什么当我们没有完整的容器版本(肯定是迄今为止最常见的情况)或类似地留下向量擦除-删除习语的暴行时,他们为什么要添加这些基本的东西:
v.erase(std::remove(v.begin(), v.end(), elem), v.end());
似乎我用 C++ 编写的每个项目最终都会包含我自己的自定义头文件,其中包含类似这样的基本语法糖。
当然,任何微不足道的整个容器重载都可以包含在自定义标头中。许多标准化的简单算法也是如此。
我试图理解的是,为什么标准中有充分的理由,例如 std::max_element 和 std::fill 范围内的东西,而不是在整个容器上运行的版本,或者其他减少冗长的语法糖编写 C++ 代码。
【问题讨论】:
-
我不能说为什么我们以前没有它,但我们现在(大部分)有了它:en.cppreference.com/w/cpp/ranges
-
当你想在容器的子范围上运行这些算法时怎么办?看来您基本上是要求通过为每个需要一个范围的函数添加一个完整容器版本来将库的算法部分中的函数数量加倍。 (对于那些需要两个范围的人来说是四倍)
-
这样设计的基本原理可以写满整本书。事实上,Alexander Stepanov 就是这样做的(因为您标记了这个 STL)。
-
看起来规范的 target 需要更新。
-
@cigien 或多或少是个骗子,不是吗?好的,OP 询问原因,但只能在此处以基于意见的方式回答。
标签: c++ stl standardization