【问题标题】: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]);

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


【解决方案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 之后。

【讨论】:

    猜你喜欢
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2017-06-03
    • 2014-09-18
    相关资源
    最近更新 更多