c++ - 为什么不在带有迭代器参数的标准库函数中提供重载?

标签 c++ algorithm c++11 iterator range

<分区>

标准库中有很多函数的结构如下:

std::foo(begin(x), end(x), bar);

令我困扰的是,99% 的时间里,参数都是开始和结束。为什么这些函数不都具有肯定会更频繁使用的重载,例如:

std::foo(x, bar);

这是语言或设计限制还是疏忽?谢谢。

最佳答案

看看Herb Sutter的旧专栏"Why no container-based algorithms?"

问题是如果你已经有例如

template<class Iter>             std::sort(Iter, Iter)       // (1)
template<class Iter, class Pred> std::sort(Iter, Iter, Pred) // (2)

然后介绍

template<class Container>             std::sort(Container)       // (3)
template<class Container, class Pred> std::sort(Container, Pred) // (4)

让 C++98 容器很难区分 (1) 和 (4):只需将 iteratorconst_iterator 传递给 sort() 和重载解析可以匹配 (4) 而不是 (1)。

使用 C++11 和 SFINAE 应该可以解决大部分这些问题,但完全重写可能要等到 Concepts。和 Ranges已由 C++ 标准委员会全面制定。

关于c++ - 为什么不在带有迭代器参数的标准库函数中提供重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22417332/

相关文章:

c++ - 链接提取和插入、包围

algorithm - 算法描述中的 "straightforward UF"指的是什么?

javascript - "Join"两个数组

c++ - noexcept 说明符神秘地破坏了编译(clang,gcc 不同意)

c++ - 有没有办法在 Visual Studio Express '12 项目中编译和运行单个 .cpp 文件?

Python 字典与 C++ 标准 :unordered_map (cython) vs cythonized python dict

algorithm - "get it"是如何证明的?

c++ - std::reference_wrapper<T> 的隐式 T& 构造函数是否会使使用变得危险?

c++ - 是否可以将实现模板特化定义为另一种类型的 typedef?

c++ - mingw windows找不到Eigen头文件