在C ++中对矢量进行排序时,可以使用STL:
std::sort(vec.begin(), vec.end());
由于这是非常常见的用法(即提供开始和结束迭代器),我想知道为什么没有可以接受对向量的引用的排序重载,例如:
template <typename T>
void sort(vector<T>& vec)
{
std::sort(vec.begin(), vec.end());
}
答案 0 :(得分:1)
分为算法,数据结构和迭代器的标准库的当前设计具有一些非常好的概念含义:算法仅在迭代器上运行,从不在容器上运行。这意味着算法本身不能使迭代器失效,并且所有迭代器失效都来自容器修改,必须明确地进行容器修改。
例如,这就是为什么remove-erase需要两个组件:序列的非无效重新排列,然后是容器操作以收缩容器。
此外,并非所有范围都来自容器,因此根据迭代器表达算法的精神更接近于在抽象“范围”上操作而不是包含范围的具体事物。
当然还有复杂性的原始论点:通过用迭代器表示算法和容器,库需要O( M + N )组件,其中< em> M 是算法的数量, N 是容器的数量,而如果每个容器有一个算法,则需要O( MN )组件。是的,您可以使用模板,但是完全不受约束的模板(例如template <typename T> void sort(T&)
具有非本地含义,并且约束模板很难且很微妙(例如,计算任何需要使用enable_if
的人的头发,或者面对他们的用户,或者试图将“概念”添加到C ++中。