为何vector无法填充值?数组重排功能代码异常排查
C++向量洗牌函数填充失败问题解决
问题说明
目标是实现一个函数,接收格式为{x1, x2, x3, y1, y2, y3}的int向量,返回重排为{x1, y1, x2, y2, x3, y3}的向量。逻辑没问题,但运行时向量始终无法正确填充值。
问题代码
vector<int> shuffle(vector<int>& nums, int n) { vector<int> temp; temp.reserve(2*n); int xCounter = 0; int yCounter = n; for (int i=0; i<2*n; i+=2){ // populate arr x val temp[i] = (nums[xCounter]); // populate arr y val temp[i+1] = (nums[yCounter]); ++xCounter; ++yCounter; } return temp; } int main() { vector<int> yoMomma = {1,2,3,1,2,3}; vector<int> ans; ans = shuffle(yoMomma,yoMomma.size()/2); return 0; }
问题根源
temp.reserve(2*n)只是给向量预留了足够的内存空间,但并没有创建实际的元素,此时向量的size()还是0。直接用temp[i]去赋值属于越界访问未初始化的内存,是C++里的未定义行为,自然填不上值。
两种修复方法
方法一:初始化时指定向量大小
把vector<int> temp;改成vector<int> temp(2*n);,这样向量会直接创建2n个默认初始化的元素,之后就能正常用下标赋值了。
方法二:用push_back添加元素
放弃下标赋值,改用push_back逐个添加元素,循环次数也可以简化成n次(每次加一对x和y):
vector<int> shuffle(vector<int>& nums, int n) { vector<int> temp; temp.reserve(2*n); // 可选,提前预留空间避免多次扩容,提升性能 int xCounter = 0; int yCounter = n; for (int i=0; i<n; ++i){ temp.push_back(nums[xCounter++]); temp.push_back(nums[yCounter++]); } return temp; }
效果验证
修复后运行代码,ans会被正确赋值为{1,1,2,2,3,3},完全符合预期。
内容的提问来源于stack exchange,提问作者wjtwise
相关产品推荐
相关产品推荐

