为什么没有std::sort(vector<T>&)

Why there is no std::sort(vector<T>&)

本文关键字:lt gt std sort 为什么 vector      更新时间:2023-10-16

在C 中排序向量时,您可以使用stl as:

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

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

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

标准库的当前设计,该设计将算法,数据结构和迭代器分为算法具有一些非常好的概念含义:算法仅在迭代器上运行,从不在容器上。这意味着算法本身不能使迭代器无效,并且所有迭代器无效都是通过容器修改的,必须明确进行。

这是例如,删除 - 启动过程需要两个组成部分:序列的无侵袭重排,然后进行容器操作以缩小容器。

此外,并非所有范围都来自容器,因此,用迭代器来表达算法的精神更接近于抽象"范围",而不是在包含范围的具体物品上。

当然,复杂性的原始论点是:通过迭代器来表达算法和容器,库需要o( m n )组件,其中 m 是算法的数量和 n 容器的数量,而如果每个容器有一个算法,则需要O( mn )组件。是的,您可以使用模板,但是完全不受约束的模板(例如template <typename T> void sort(T&)具有非本地含义,约束模板很难且微妙(例如,在任何需要与enable_if合作或面对他们的用户或试图面对用户的人身上计算头发将"概念"添加到C )。