为什么STL反向算法不能像我预期的那样工作?

时间:2015-07-26 00:38:16

标签: c++ stl-algorithm

尝试反转矢量的一部分:

vector<int> nums{1,2,3};
std::reverse(nums.begin(), nums.end()); //LINE1
std::reverse(nums.begin(), (nums.begin() + 1)); //LINE2
std::reverse((nums.begin() + 2), nums.end()); //LINE3

在LINE1之后,nums {3,2,1}

在LINE2和LINE3之后,没有变化。

预期:nums {2,3,1}

1 个答案:

答案 0 :(得分:4)

来自documentation for std::reverse

  

反向范围

     

撤消 [first,last> 范围内元素的顺序。

注意半开范围。

所以,假设你有三个元素(范围[0; 2]):

1) std::reverse(nums.begin(), (nums.begin() + 1));

这在范围[0; 0 + 1) - &gt; [0; 1) - &gt; [0; 0](它是一个开放范围,因此结束边界本身不包括在内)。

2) std::reverse((nums.begin() + 2), nums.end());

在这里,无论如何,关于范围reverse进行操作,你都错了。 begin() + 2表示您案例中的最后一个元素,而end()表示...结尾。所以这条线毫无意义,什么都不做。