2016-08-04 71 views
-3

我是C++新手。我試圖創建一個多維數組。這段代碼有什麼問題?C++ - 你如何創建多維數組?

int sorted_array[] = {{2, 3}, 5, 7}; 

它給了我這個錯誤。

error: braces around scalar initializer for type 'int' 

謝謝。

+1

在C++中,你通常不使用原始數組。 C++中的多維數組應該是'std :: array ,DIM2> sorted_array;'。 –

回答

4

聲明多維數組時,必須指定除第一個之外的所有維。

例如

int sorted_array[][2] = {{2, 3}, {5}, {7}}; 

這相當於:

int sorted_array[3][2] = {{2, 3}, {5}, {7}}; 

不能使用:

int sorted_array[][] = {{2, 3}, {5}, {7}}; 

和期望編譯器推斷2第二維度。

+0

很好的解釋,謝謝。 –

0

有創建多維數組的許多方式:

int sorted_array[2][2] = {{2,3},{5,7}}; 

這產生一個陣列,其存儲2名整型陣列存儲2個整數

,但我會建議的載體

#include <vector> 
std::vector<std::vector<int> > sorted_array = {{2,3},{5,7}}; 

這是同樣的事情,但矢量有更多的功能

你可以訪問它們都以同樣的方式:

sorted_array[0][1] = 3; 
+1

值得一提的是,當編譯時已知固定尺寸時,應使用'std :: array'。 –

0

其他的答案是正確的,當然,但它是值得一提的是,創建一個二維數組的便捷方式是包裝扁平行主要std::vector一類如下:

template<typename _Ty> 
class matrix { 
    // used to enabled [][] overload on matrix objects 
    class proxy_row_vector { 
    public: 
     proxy_row_vector(std::vector<_Ty>& _vec, std::size_t _cols, std::size_t _row_index) 
      : vec(_vec), cols(_cols), row_index(_row_index) {} 
     const _Ty& operator[](std::size_t col_index) const { 
      return vec[row_index*cols + col_index]; 
     } 
     _Ty& operator[](std::size_t col_index) { 
      return vec[row_index*cols + col_index]; 
     } 
    private: 
     std::vector<_Ty>& vec; 
     std::size_t cols; 
     std::size_t row_index; 
    }; 
public: 
    matrix(std::size_t _rows, std::size_t _cols) 
     : mtx(_rows*_cols), rows(_rows), cols(_cols) {} 
    proxy_row_vector operator[](std::size_t row_index) const { 
     return proxy_row_vector(mtx, cols, row_index); 
    } 
    proxy_row_vector operator[](std::size_t row_index) { 
     return proxy_row_vector(mtx, cols, row_index); 
    } 
    std::vector<_Ty>::const_iterator cbegin() const { 
     return mtx.cbegin(); 
    } 
    std::vector<_Ty>::const_iterator cend() const { 
     return mtx.cend(); 
    } 
    // ... other iterator access methods ... 
private: 
    std::vector<_Ty> mtx; 
    std::size_t rows; 
    std::size_t cols; 
}; 

然後就可以簡單地如下創建一個二維數組和操作使用索引或迭代元素:

matrix<int> m(3,3); // default initialises 3x3 matrix of ints 
m[0][0] = 1; // set first row, first column element to 1 
for (auto& el : m) 
    el = 4; // fill m with value 4 

這樣做的優點方法是簡單的迭代器支持,允許您使用任何標準算法來操縱矩陣元素,併爲任何二維元素陣列提供方便的管理界面。

注:以上級matrix是很小的,你會明顯地要提供進一步的方法和構造函數(如at方法邊界檢查,以及一個rows()方法和發現的行數columns()方法,矩陣的列)。