首页 > 解决方案 > Void 值没有被忽略(试图将 void 分配给非 void 变量?)

问题描述

vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) {
        int row = nums.size();
        int col = nums[0].size();
        vector<vector<int>> newNums;
        if((row*col) < (r*c)){
            return nums;
        }
        else{
            deque<int> storage;
            for(int i = 0; i < row; i++){
                for(int k = 0; k < col; k++){
                    storage.push_back(nums[i][k]);
                }
            }
            for(int j = 0; j < r; j++){
                for(int l = 0; l < c; l++){
                    newNums[j][l] = storage.pop_front();
                }
            }
        }
        return newNums;
    }

嘿,伙计们,我遇到了一个问题,我在上面的标题中出现了上述错误“不应忽略的无效值”。当我查看错误消息时,提示说明“这是一条 GCC 错误消息,这意味着函数的返回值是 'void',但您正在尝试将其分配给非 void 变量。您是” t 允许将 void 分配给整数或任何其他类型。” 读完这篇文章后,我认为我的双端队列没有被填充;但是,我不知道为什么我的双端队列没有被填充。如果你们想知道我要解决的问题,我将在下面发布。另外,我不能通过调试器运行它,因为它不会编译:(。提前致谢。

在 MATLAB 中有一个非常有用的函数叫做'reshape',它可以将一个矩阵重新整形为一个不同大小的新矩阵,但保留其原始数据。

给定一个由二维数组表示的矩阵,以及两个正整数 r 和 c,分别表示所需重构矩阵的行号和列号。

重新整形的矩阵需要以与原来相同的行遍历顺序填充原始矩阵的所有元素。

如果给定参数的“重塑”操作是可能的且合法的,则输出新的重塑矩阵;否则,输出原始矩阵。

   Example 1:
    Input: 
    nums = 
    [[1,2],
     [3,4]]
    r = 1, c = 4
    Output: 
    [[1,2,3,4]]
    Explanation:
    The row-traversing of nums is [1,2,3,4]. The new reshaped matrix is a 1 * 4 matrix, fill it row by row by using the previous list.

标签: c++

解决方案


这条线有两个问题:

newNums[j][l] = storage.pop_front();

首先,pop_front()不返回被弹出的元素。要获取双端队列的第一个元素,请使用storage[0]. 然后调用pop_front()删除它。

您也不能分配给newNums[j][i],因为您还没有分配向量的那些元素。您可以通过像这样声明它来预分配所有内存。

vector<vector<int>> newNums(r, vector<int>(c));

所以上面的行应该替换为:

newNums[j][l] = storage[0];
storage.pop_front();

推荐阅读