【问题标题】:C++ question regarding multidimensional array关于多维数组的 C++ 问题
【发布时间】:2021-01-28 03:53:28
【问题描述】:

我的 C++ 技能生疏了,但我试图帮助我儿子完成作业,如果很简单,请原谅我。

我正在尝试查找数组中某个元素的所有邻居,并查看该特定元素是否大于其所有邻居。


 #include <iostream>
using namespace std;
 
int row2(int arr[][3], int n){
  cout << "row2";
    if (arr[1][n] > arr[0][n] && arr[1][n] > arr[0][1] && arr[1][n] > arr[1][1] && arr[1][n] > arr[2][1] && arr[1][n] > arr[2][n]){
      return true;
    }
    else 
      return false;


}
int row3(int arr[][3], int n){
  cout << "row3==n";
  cout << n;
  if (n == 0 || n == 2){
    
    if (arr[3][n] > arr[1][n] && arr[3][n] > arr[3][1] && arr[3][n] > arr[1][1]){
      cout << "row3 if";
      return true;
    }
    else 
     cout << "row3 else";
      return false;
  }
  else{
    if (arr[3][1] > arr[3][2] && arr[3][1] > arr[3][0] && arr[3][1] > arr[1][2] && arr[3][1] > arr[1][0] && arr[3][1] > arr[1][1]){
      return true;
    }
    else 
      return false;

  }
}

编译时我在这行 val = arr[counterx] [counter];预期的 lambda 表达式主体 val4 = arr[val2], [val3];

任何指针?

提前致谢!

【问题讨论】:

  • 你确定arr 是一个多维数组?
  • 话虽如此,您可能正在使用不同的编译器或编译器版本。
  • @J,我已经编辑了代码。 ** 不是代码的一部分。
  • val4 = arr[val2], [val3]; 应该做什么?你的意思是写arr[val2][val3];

标签: c++ arrays


【解决方案1】:

显示的代码有几个错误和错误。语法错误和逻辑错误。

void findit(int arr[], int sizey, int sizex)

这将第一个参数声明为普通的花园品种数组。只是一个一维数组。此数组中的典型值可能是arr[0],或arr[1],或者如果x 是某个整数变量,则可能是arr[x]。但是,在这个函数中:

 val = arr[counterx] [counter];

这会尝试访问arr,就像它是一个二维数组一样,而不是:arr[something][somethingelse]。那将是一个二维数组,而 arr 被声明为一维数组。

在您的main 中声明一个

  int arr[3][3] 

这是一个二维数组,但随后将其传递给findit

   findit(arr, m,n);

然而,正如我们刚刚发现的,findit 的第一个参数不是二维数组,而是一维数组。很明显finditarr应该声明为二维数组。

但是,在 C++ 中,无法将二维数组传递给 C++ 函数,其中未指定第一维第二维。 C++ 不能以这种方式工作。在数组参数规范中,在 C++ 中,只有 first 数组维度可以不指定。必须指定第二个和 all 以下维度。例如,您可以声明:

 void findit(int arr[][3], int sizey, int sizex)

这将允许您传递ints 的任何二维数组,只要第二维为 3。但是传递两个 size 参数是没有意义的。只需要显式传入第一个维度的大小,因为第二个维度的大小是已知的。

最后:

 val4 = arr[val2], [val3];

不清楚这是什么,但这不是有效的 C++ 语法。如果您打算使用给定的索引访问此二维数组中的元素,则适当的语法为:

 val4 = arr[val2][val3];

这解决了所示代码中的基本编译错误。不幸的是,显示的代码中有很多很多明显的逻辑问题。比如其中一个逻辑问题:

 val = arr[counterx] [counter];

如果您检查前面的 for 循环,您会发现:

 for (int counterx = -1; counter <= sizex; counter++){

所以,counterx 变量将从 -1 开始迭代,所以上面似乎会尝试评估:

 val = arr[-1][counter];

在 C++ 中,没有数组在负索引偏移处具有值,因此上述逻辑将导致未定义的行为和无意义的结果。如果您有任何类型的数组,例如x[],您可能会在x[0]x[1] 找到一些东西,但在x[-1] 找不到。这同样适用于多维数组。

这是第一个肉眼明显的逻辑错误,这里可能还有更多。总体而言,所示代码中的方法有些不清楚。您可能会从退后一步重新设计此任务的整体方法中受益,因为显示的逻辑在几个基本方面似乎并没有正确地处理它。

【讨论】:

  • 我更改了语法错误和 -1 错误,但似乎输出只是一堆随机字母,而且相当多。您看到还有其他方法可以更改此代码吗?谢谢!
  • 所描述的目标:在矩阵中找到大于其所有邻居的值,具有两个必要的逻辑组件:1)扫描矩阵中的每个值 2)将每个值与其所有邻居进行比较.不用说,矩阵边缘上的值不会让每个相邻值都在矩阵中间。中间的有 9 个相邻值。例如,角落里的值只有 3 个。因此,这个逻辑必须有一些方法来确定每个值的哪些邻居实际存在。显示的代码中完全没有这种逻辑。
  • 下一步:一旦你弄清楚每个值有哪些邻居,很明显你必须一次检查一个,如果你找到更大的一个,你就完成了,他的值确实没有资格,不再需要检查剩余的邻居,你的鹅已经煮熟了。显示的代码中完全没有这种决策。
  • 非常感谢山姆的回复。将尝试修复代码并返回。
  • 稍微更改了代码,但没有打印输出
【解决方案2】:

lambda 表达式的预期主体 val4 = arr[val2], [val3];

这行val4 = arr[val2], [val3]; 似乎有语法错误,而不是您在问题中提到的那个。

我假设你的意思是写 val4 = arr[val2][val3]; 不带逗号。

话虽如此,val2 和 val3 的值被分配了相同的值,如果未选中,可能会导致索引越界异常。此外,从 -1 开始 counter 和 counterx 会导致越界异常。

此外,如果不将多维数组作为双指针传递或对大小进行硬编码,则无法将多维数组传递给函数。


编辑 1: 我整理了一个解决方案来查找每行中的最大数量。它不是最优化的代码,但它快速且有效。我假设行,列大小可能会改变,所以我使用 std::vector 而不是 std:array 或原始数组。但是,如果您知道可以将 int[3][3] 硬编码到您的解决方案中,则可以恢复。

#include <iostream>
#include <iterator>
#include <iostream>
#include <algorithm>
#include <array>
 
void findit(std::vector<std::vector<int>> arr){  
  for (size_t rowsIndex = 0; rowsIndex <= arr.size(); rowsIndex++){
    std::vector<int> row = arr[rowsIndex];
    int maxNum = *std::max_element(row.begin(), row.end());

    std::cout<< "largest num in row " << rowsIndex << ": " << maxNum << std::endl;
  }
}

int main(){
  std::vector<std::vector<int>> arr;
  arr.push_back({0, 1, 2 });
  arr.push_back({4, 5, 6 });
  arr.push_back({8, 9, 10});
  
  findit(arr);
}

编辑 2:

如果你想检查一个目标索引与相邻的索引,没有必要使用 forloop。只有 4(或 8)个可能的缺陷需要检查,只是更容易(和有效)对它们进行硬编码:

#include <iostream>
#include <iterator>
#include <iostream>
#include <algorithm>
#include <array>

void checkIfIndexIsLargestInItsAdjacency(std::vector<std::vector<int>> arr, size_t targetRow, size_t targetColumn){
    int targetNumber = arr[targetRow][targetColumn];
    int numberToTheLeft = targetColumn > 0 ? arr[targetRow][targetColumn-1] : 0;
    int numberToTheRight = targetColumn + 1 < arr[targetRow].size() ? arr[targetRow][targetColumn+1] : 0;
    int numberToTheUp = targetRow > 0 ? arr[targetRow-1][targetColumn] : 0;
    int numberToTheDown = targetRow + 1 < arr.size() ? arr[targetRow+1][targetColumn] : 0;
    std::cout<< "targetNumber: " << targetNumber << std::endl;
    std::cout<< "Number to the left: " << numberToTheLeft << std::endl;
    std::cout<< "Number to the right: " << numberToTheRight << std::endl;
    std::cout<< "Number to the up: " << numberToTheUp << std::endl;
    std::cout<< "Number to the down: " << numberToTheDown << std::endl;
    
    std::array<int, 4> adjacentNumbers = {numberToTheLeft, numberToTheRight, numberToTheUp, numberToTheDown};
    int maxAdjacentNum = *std::max_element(adjacentNumbers.begin(), adjacentNumbers.end());
    
    std::cout << "Target number is " << (maxAdjacentNum >= targetNumber? "smaller" : "bigger") << " than adjacent numbers" << std::endl;
}

int main(){
  std::vector<std::vector<int>> arr;
  arr.push_back({0, 1, 2 });
  arr.push_back({4, 5, 6 });
  arr.push_back({8, 9, 10});
  
  checkIfIndexIsLargestInItsAdjacency(arr, 1, 1);
  checkIfIndexIsLargestInItsAdjacency(arr, 2, 2);
}

示例输出:

targetNumber: 5
Number to the left: 4
Number to the right: 6
Number to the up: 1
Number to the down: 9
Target number is smaller than adjacent numbers
targetNumber: 10
Number to the left: 9
Number to the right: 0
Number to the up: 6
Number to the down: 0
Target number is bigger than adjacent numbers

【讨论】:

  • 您也可以使用 forloop 来获取 {numberToTheLeft, numberToTheRight, ...} 的值,而不是使用四个单独的变量,以更容易者为准。
  • 感谢您在尝试您的代码之前,我已将发布的代码修改为下面,但它没有打印任何值
猜你喜欢
  • 1970-01-01
  • 2012-02-06
  • 2011-02-09
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 2016-05-03
相关资源
最近更新 更多