为什么标准库函数中没有使用迭代器参数提供重载?

时间:2014-03-14 23:03:27

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

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

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

令我困扰的是,99%的时间,争论都是开始和结束。为什么这些功能都没有过载,这些过载肯定会更常用,如:

std::foo(x, bar);

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

1 个答案:

答案 0 :(得分:5)

看看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,应该可以解决大多数这些问题,但完全重写可能要等到ConceptsRanges完全解决了C ++标准委员会。