【问题标题】:Why there is no std::sort(vector<T>&)为什么没有 std::sort(vector<T>&)
【发布时间】:2017-02-22 03:04:21
【问题描述】:

在 C++ 中对向量进行排序时,您可以将 STL 用作:

std::sort(vec.begin(), vec.end());

由于这是非常常见的用法(即提供开始和结束迭代器),我想知道为什么没有排序重载可以接受对向量的引用,例如:

template <typename T>
void sort(vector<T>& vec)
{
    std::sort(vec.begin(), vec.end());
}

【问题讨论】:

  • 可能是因为他们必须为每个容器定义一个。更有可能是 T&amp; vec 而不是 vector&lt;T&gt;&amp; vec 在任何容器上工作。
  • 这是 Ranges TS 的一部分,它有一个 Range 概念,可用于限制您可以排序的类型。在这种情况下,它实际上有一个 Sortable 概念,它比普通的 Range 有一些额外的要求。
  • 你的函数不能和​​我的vector&lt;T, BetterAlloc&lt;T&gt;一起工作。嘘。
  • sort() 采用可选的比较器,因此sort(container) 实际上应该有第二个可选的比较器参数,以便与所有模板算法的工作方式保持一致。但这将使sort() 有两个参数,现在与现有的sort() 冲突,后者采用一个开始和一个结束迭代器值(加上一个可选的比较器)。我认为可以在这里消除两者的歧义,但这很难,而且完全没有必要。简单地定义 sort_container(T, Comparator=std::less&lt;...&gt;), IMO 会更简洁。
  • @KerrekSB:这正是它应该提供的原因:你不能自己写!

标签: c++ sorting stl iterator


【解决方案1】:

标准库的当前设计分为算法、数据结构和迭代器,具有一些非常好的概念含义:算法只在迭代器上运行,从不在容器上运行。这意味着算法本身不能使迭代器失效,所有的迭代器失效都是通过容器修改来实现的,这必须显式地进行。

这就是为什么 remove-erase 需要两个组件的原因:序列的非无效重排,然后是容器操作以缩小容器。

此外,并非所有范围都来自容器,因此用迭代器表示算法在精神上更接近于对抽象“范围”进行操作,而不是在包含范围的具体事物上进行操作。

当然还有复杂性的原始论点:通过用迭代器表达算法和容器,库需要 O(M + N) 个组件,其中 M 是算法的数量,N 是容器的数量,而如果每个容器有一个算法,则需要 O(MN) 个组件.是的,您可以使用模板,但完全不受约束的模板(例如,template &lt;typename T&gt; void sort(T&amp;) 具有非本地含义,并且限制模板是困难而微妙的(例如,计算任何需要使用 enable_if 或面对他们的用户的人的头发) , 或尝试在 C++ 中添加“概念”)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 2018-02-17
    • 2017-05-22
    • 1970-01-01
    • 2019-10-20
    • 2016-03-31
    • 2011-05-19
    相关资源
    最近更新 更多