簡體   English   中英

C ++-將靜態2D數組傳遞給函數

[英]C++ - passing static 2d array to functions

我應該如何將靜態2d數組傳遞給cpp中的參數? 我嘗試過這樣的事情:

 void foo(int (&tab)[N][N]) {
    // function body
 }

int main() {
  int n;
  cin >> n;
  int tab[n][n];
  foo(tab); // doesn't work
  return 0;
}

嘗試調用foo時,出現“無匹配函數錯誤”。

我需要靜態數組,因為矢量對於我的需求而言太慢了。 我也想避免聲明具有10000行和列的數組。 而且,我想使用函數,因為它將使我的代碼可讀。 有什么解決方案可以滿足我的期望嗎?

使用cin >> n;int tab[n][n]; ,則聲明一個可變長度數組(即,其尺寸不是編譯時常數的數組)。 這里有兩個問題:首先,標准C ++不支持它們,其次,它們與您介紹的固定大小的數組參數不兼容。 但是,如果使用編譯時已知的大小聲明數組,則它將起作用:

#define N 10

void foo(int (&tab)[N][N]) {
    cout << tab[1][1] << endl;
}

int main() {
    int tab[N][N] = {};
    tab[1][1]=15;
    foo(tab);
    return 0;
}

經典的C ++解決方案將涉及使用向量的向量。 如果不合適(因為您需要更快的速度或對內存的更多控制),則可以為正方形二維數組定義自己的類。

我在代碼中使用的一個想法是,使用底層的一維vector實現該目標,並使用訪問器方法返回一個指針。

struct My_2D_Array
{
    explicit My_2D_Array(size_t n):
        m_size(n),
        m_data(n * n)
    {
    }

    int* operator[](size_t i)
    {
        return m_data.data() + i * m_size;
    }
    size_t m_size;
    std::vector<int> m_data;
};

這不僅缺少所有的健全性檢查,而且使綁定檢查的訪問成為不可能(因為訪問器返回了裸指針),而且將作為一種快速而又骯臟的解決方案。

在代碼中的用法:

int foo(My_2D_Array& matrix)
{
    // example
    return matrix[2][3] + matrix[3][2];
}

int main()
{
    int n;
    cin >> n;
    My_2D_Array tab(n);
    foo(tab);
    return 0;
}

這個想法是高度可定制的-您可以根據需要使My_2D_Array的代碼簡單或聰明。 例如,如果您仍然不喜歡使用vector ,即使它是一維的,您也可以單獨管理(分配/取消分配)內存,並將int*而不是vector<int>My_2D_Array

只使用一個vector<>vector<int> 無需混用非標准陣列。

暫無
暫無

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

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