呼叫 std::sort

Calling std::sort

sort在C++标准库中的调用方式为:

sort (first element, last element);

所以如果我有一个数组:

int a[n];

我应该称 sort 为:

sort(&a[0], &a[n-1]);

因为 a[0] 是第一个元素,a[n-1] 是最后一个。但是,当我这样做时,它不会对最后一个元素进行排序。要获得完全排序的数组,我必须使用:

sort(&a[0], &a[n]);

这是为什么?

Format for sort in STL in c++ is,

sort (first element, last element);

不,不是。正如您所发现的,您应该为第一个元素提供一个迭代器,并提供一个 one-past-the-end 迭代器。

标准库一般使用semi-open intervals通过迭代器来描述范围。否则无法表达空范围:

// An empty container!
std::vector<int> v;

// Pretend that `v.end()` returns an iterator for the actual last element,
// with the same caveat as `v.begin()` that the case where no elements
// exist gives you some kind of "sentinel" iterator that does not represent
// any element at all and cannot be dereferenced
std::vector<int>::iterator a = v.begin(), b = v.end();

// Oh no, this would think that there's one element!
std::sort(a, b);

因为 stl 中的范围总是定义为从第一个元素迭代器到 "one-past-the-end"-迭代器的半开范围。对于 C++11,您可以使用:

int a[n];
sort(std::begin(a),std::end(a));