【问题标题】:Why does std::reverse require bidirectional iterators?为什么 std::reverse 需要双向迭代器?
【发布时间】:2017-02-19 08:10:03
【问题描述】:

为什么std::reverse(c.begin(), c.end()) 要求底层容器c 提供双向迭代器?

事实上,这意味着 (multi-)map, (multi-)set,但它们当然不能颠倒,因为它们是有序的。唯一的另一个 bi-dir 容器是 list,但它有自己的成员函数 .reverse()。

这意味着可以在array、vector 和deque 上应用std::reverse,它们是随机访问。

那么,为什么不“诚实”地说:需要随机访问,或者使用成员函数?

【问题讨论】:

  • 因为这会对用户定义的迭代器造成不必要的限制
  • @krzaq 我也这么想。但我认为无法将指定的功能应用于 80% 的已交付潜在目标是很奇怪的。我可能会发明一个介于两者之间或正交的迭代器类别,比如“有序”之类的。特别是。因为这些参考页面上std::reverse 的文档中没有提到不适用性。也许在规范本身?
  • 我可以使用map 或set 作为merge-target(需要输出迭代器)吗? remove 在map 和/或set 上怎么样?可能不会,因为它们会重新排序,但那写在哪里?
  • @krzaq 你可以把它写成答案。
  • "那么,为什么不“诚实”并说:需要随机访问" 因为不需要随机访问,所以这是不诚实的。

标签: c++ algorithm iterator reverse iterator-traits


【解决方案1】:

您甚至不需要使用用户定义的迭代器,您可以在自己的问题中提供答案。

唯一的另一个bi-dir容器是list,但它有自己的成员函数.reverse()。

但是,该成员函数会反转整个列表。 std::reverse 只允许反转列表的一部分,方法是传递除 list.begin() 和 list.end() 之外的其他迭代器。

【讨论】:

    【解决方案2】:

    这样做会不必要地限制用户定义的迭代器或使用双向反应迭代器的硬币容器。而且由于随机访问不是必需的,因此不应该是必需的。

    【讨论】:

    • 或使用双向迭代器的用户定义容器。
    猜你喜欢
    • 2011-07-19
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    相关资源
    最近更新 更多