簡體   English   中英

C++關於多維數組的問題

[英]C++ question regarding multidimensional array

我的 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];

任何指針?

提前致謝!

lambda 表達式的預期主體 val4 = arr[val2], [val3];

這一行似乎有語法錯誤val4 = arr[val2], [val3]; 而不是你在問題中提到的那個。

我假設您打算寫val4 = arr[val2][val3]; 沒有逗號。

話雖如此,val2 和 val3 的值被分配了相同的值,如果未選中,可能會導致索引越界異常。 此外,從 -1 開始 counter 和 counterx 將導致超出范圍的異常。

此外,如果不將多維數組作為雙指針傳遞或對大小進行硬編碼,則無法將多維數組傳遞給 function。


編輯 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);
}

示例 output:

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

顯示的代碼有幾個錯誤和錯誤。 語法錯誤和邏輯錯誤。

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

這將第一個參數聲明為普通的花園品種數組。 只是一個一維數組。 此數組中的典型值可能是arr[0]arr[1] ,或者如果x是某個 integer 變量,則可能是arr[x] 但是,在這個 function 中:

 val = arr[counterx] [counter];

這試圖訪問arr ,就好像它是一個二維數組,而不是: arr[something][somethingelse] 那將是一個二維數組,而arr被聲明為一維數組。

在您的main聲明中

  int arr[3][3] 

這是一個二維數組,然后將其傳遞給findit

   findit(arr, m,n);

然而,正如我們剛剛發現的, findit的第一個參數不是二維數組,而是一維數組。 很明顯finditarr應該聲明為二維數組。

但是,在 C++ 中,沒有辦法將二維數組傳遞給 C++ function,具有未指定的第一維第二維。 C++ 不能這樣工作。 在數組參數規范中,在 C++ 中,只能不指定第一個數組維度。 必須指定第二個和所有后續尺寸。 例如,您可以聲明:

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

這將允許您傳遞任何int的二維數組,只要第二維是 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]找到。 這同樣適用於多維 arrays。

這是第一個肉眼可見的邏輯錯誤,這里可能還有更多。 總體而言,所示代碼中的方法有些不清楚。 您可能會從退后一步並重新設計此任務的整體方法中受益,因為顯示的邏輯在幾個基本方面似乎並沒有正確地進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM