为什么STL逆向算法没有像我预期的那样工作?
Why does the STL reverse algorithm not work as I expect?
尝试反转向量的一部分:
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}
来自documentation for std::reverse
:
Reverse range
Reverses the order of the elements in the range [first,last).
注意半开范围。
因此,假设您有三个元素(范围 [0;2]):
1) std::reverse(nums.begin(), (nums.begin() + 1));
这在范围[0; 0+1) -> [0; 1) -> [0;0](这是一个开放范围,因此不包括闭合边界本身)。
2) std::reverse((nums.begin() + 2), nums.end());
在这里,关于范围 reverse
操作,无论如何你都弄错了。 begin() + 2
表示您案例中的最后一个元素,而 end()
是...结束。所以这一行没有意义,什么也不做。
尝试反转向量的一部分:
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}
来自documentation for std::reverse
:
Reverse range
Reverses the order of the elements in the range [first,last).
注意半开范围。
因此,假设您有三个元素(范围 [0;2]):
1) std::reverse(nums.begin(), (nums.begin() + 1));
这在范围[0; 0+1) -> [0; 1) -> [0;0](这是一个开放范围,因此不包括闭合边界本身)。
2) std::reverse((nums.begin() + 2), nums.end());
在这里,关于范围 reverse
操作,无论如何你都弄错了。 begin() + 2
表示您案例中的最后一个元素,而 end()
是...结束。所以这一行没有意义,什么也不做。