【问题标题】:Void value not ignored as it ought to be (Trying to assign void to non-void variable?)Void 值没有被忽略(试图将 void 分配给非 void 变量?)
【发布时间】:2018-06-29 22:18:07
【问题描述】:
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 变量。不允许将 void 分配给整数或任何其他类型。” 阅读此内容后,我认为我的双端队列没有被填充;但是,我不知道为什么我的双端队列没有被填充。如果你们想知道我要解决的问题,我将在下面发布。另外,我无法通过调试器运行它,因为它不会编译:(。提前致谢。

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

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

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

如果给定参数的'reshape'操作是可行且合法的,则输出新的reshape矩阵;否则,输出原始矩阵。

   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++


【解决方案1】:

这一行有两个问题:

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();

【讨论】:

  • 你的意思是我没有分配向量的那些元素?它们不是空的,因为我还没有设置它们吗?而且啊,我看到 pop_front 不返回值,而只是从列表中删除元素。我能避免用堆栈来引用某物的位置吗?因为这会在我的 for 循环中引起问题,因为双端队列的大小与循环约束的大小不同,因此我不会完全搜索双端队列。
  • 声明向量不会在向量中创建任何元素,除非您在声明中指定初始大小。向量元素不能用下标赋值来创建。
  • 我还没有真正阅读问题陈述,所以我不知道你的整体算法是否正确。您的循环不会尝试完全搜索双端队列,它只是将第一个 r*c 元素放入 newNums
  • reshape 的解释并没有说明如果row * col != r * c 额外的元素会发生什么。看起来您的代码尽可能正确。
  • 您可能还想阅读this。它建议为此使用std::queue 而不是std::deque
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多