为啥标准库函数中没有提供带有迭代器参数的重载? [复制]
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):只需将 iterator
和 const_iterator
传递给 sort()
,重载决议可以匹配 (4) 而不是 (1)。
使用 C++11 和 SFINAE 应该可以解决大多数这些问题,但是完全重写可能必须等到 C++ 标准委员会完全解决了 Concepts 和 Ranges 之后。
【讨论】:
以上是关于为啥标准库函数中没有提供带有迭代器参数的重载? [复制]的主要内容,如果未能解决你的问题,请参考以下文章