为啥标准库函数中没有提供带有迭代器参数的重载? [复制]

Posted

技术标签:

【中文标题】为啥标准库函数中没有提供带有迭代器参数的重载? [复制]【英文标题】:Why isn't an overload provided in standard library functions with iterator parameters? [duplicate]为什么标准库函数中没有提供带有迭代器参数的重载? [复制] 【发布时间】:2014-03-14 23:03:27 【问题描述】:

标准库中有很多这样的结构函数:

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

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

std::foo(x, bar);

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

【问题讨论】:

是什么阻止您自己编写这样的方法?标准库为您提供了通用版本——如果您想要方便重载,请尽情享受。 您已经可以使用 Boost.Range 执行此操作,但该标准可能会在不久之后获得实际范围。 boost 中已经有很多东西,很多库早就应该在标准中了。其中一些便利是人们使用 Java 和 C# 的原因。因为 .Net 和 Java库已经提供了易于使用的功能..例如,加载图像等等..不需要外部库或编写包装器..是的,是的,他们可以用不同的方式对它们进行模板化,让事情变得简单..但我不要认为任何人都能够告诉你why,而他们的意见不是标准的答案或借口。C++ 仍然是我最喜欢的语言。 无论如何 OP,我能想到的最好的意见和借口是它向后兼容 C 样式数组。对于其中一些函数,您可以将指针传递给数组的开头和结尾.. 而如果它的模板不同,并且访问了 container.begin 和 container.end,C 样式的数组可能无法使用它.. 示例:std::min(&CArray[0], &CArray[some_size]); 我问了,得到了回答:***.com/questions/11174501/why-no-sortv-in-c/… 【参考方案1】:

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

【讨论】:

以上是关于为啥标准库函数中没有提供带有迭代器参数的重载? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

c++模拟实现string类

减去和比较随机访问迭代器:为啥和在哪里?

为啥 std::bitset 不带有迭代器?

stl中vector中erase后迭代器为啥会失效

STL详解—— list的模拟实现

C++map与set模拟实现