排序矢量的一部分(到位)

时间:2018-04-16 10:53:21

标签: c++ sorting vector stl range

我无法理解为什么下面的代码不会排序vector的前两个元素:

int main() {
    std::vector<int> v = {2,1,3,1,2};
    std::sort(v.begin(),v.begin()+1);
    for(auto elem:v)
    {
      std::cout<<elem<<std::endl;
    }
    // your code goes here
    return 0;
}

有什么想法吗?

4 个答案:

答案 0 :(得分:6)

std::sort(以及所有标准库算法)需要半开范围。结束迭代器是一个过去的结束指示符(开放部分)。所以[it, it + 1)只是一个元素的范围。在你的情况下,它只是第一个向量元素。

而且,一个元素范围已经排序。

答案 1 :(得分:2)

此范围[v.begin(), v.begin() + 1 )可以像v[0]那样以数学方式编写,只包含一个等于2的元素std::sort( v.begin(), std::next( v.begin(), 2 ) ); 。如果要对2个元素进行排序,则应编写

std;:sort( v.begin(), v.begin() + 2 );

相当于

{{1}}

答案 2 :(得分:1)

Sorts the elements in the range [first, last) 

来自std::sort

如果您不熟悉表示法,)表示不包含last,您可以在this question中找到有关该表示法的更多信息。

答案 3 :(得分:1)

为了对前n个元素进行排序,您必须按以下方式指示调用:

sort(V.begin(), V.begin() + n);

因此,对于2个元素,您必须调用:

 sort(V.begin(), V.begin() + 2);

这是因为所有STL算法都采用开放范围[first,last)。