呼叫 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));
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));