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