使用std::swap反转vector<int>元素逻辑错误排查求助
问题排查与修正
你的代码逻辑问题出在循环的终止条件上:
当你用i < v.size()作为循环条件时,会遍历整个vector的所有元素。举个例子,假设vector有4个元素(下标0、1、2、3):
- i=0时,交换下标0和3的元素,此时vector完成了前半部分的第一次交换
- i=1时,交换下标1和2的元素,此时vector已经被正确反转
- i=2时,交换下标2和1的元素——这会把刚刚交换好的元素又换回去
- i=3时,交换下标3和0的元素——再次把最开始交换的元素换回去
最终整个vector相当于没做任何交换,回到了初始状态。
修正后的代码
只需要把循环条件改成遍历到vector的前半部分即可:
#include <vector> #include <algorithm> // 确保std::swap可用 void rev_vect(std::vector<int>& v) { for (int i = 0; i < v.size() / 2; ++i) { std::swap(v[i], v[v.size() - 1 - i]); } }
为什么这样可行?
- 对于长度为偶数的vector,比如4个元素,
v.size()/2等于2,循环执行i=0和i=1两次,刚好完成所有元素的配对交换 - 对于长度为奇数的vector,比如5个元素,
v.size()/2等于2(整数除法自动向下取整),循环执行i=0和i=1两次,中间的第3个元素(下标2)不需要交换,完美符合反转逻辑
内容的提问来源于stack exchange,提问作者Abdullah Othman
相关产品推荐
相关产品推荐

