c++ 为什么这个向量没有填充值?[已关闭]

1tuwyuhd  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(142)

这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
3天前关闭。
此帖子已于3天前编辑并提交审核,未能重新打开帖子:
原始关闭原因未解决
Improve this question
此函数用于获取具有{x1,x2,x3,y1,y2,y3}形式的x,y值对的向量,并返回具有如{x1,y1,x2,y2,x3,y3}这样的混洗值的向量。向量的大小为2 * n,其中n分别为x值/y值的数量。通过在函数中使用print语句,我已经确定了算法是有效的。

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;
}
k3bvogb1

k3bvogb11#

您调用的是reserve,而不是resize,所以vector实际上并没有增加大小,只是增加了容量(预先分配的内存,将来不必重新分配就可以容纳元素),但这使得所有的索引赋值都是非法的;vector仍然有一个长度为0,你不能赋值给任何一个索引。它碰巧工作了,因为reserve确保那里有内存,但是所说的内存永远不会被正确析构(所以你使用没有析构函数的基元类型是一件好事)。
将循环更改为:

for (int i=0; i<n; ++i){            
        // populate arr x val
        temp.push_back(nums[i]);
        // populate arr y val
        temp.push_back(nums[i+n]);
    }

将新值推到末尾,并保存几个不必要的变量,而不是索引。

相关问题