You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:20:54