我不會重複我的完整答案,爲什麼動態二維矩陣(這顯然是一個)不是在C++中的方式。
Answer on: 1D or 2D array, what's faster?(開始閱讀@長的答案,或爲什麼動態二維數據存儲(指針到指針或載體矢量的-)可以簡單/小矩陣「壞」。)
你會發現:
- 作一個比較詳細的解釋,爲什麼你不希望使用指針到指針的動態數組
- 簡單矩陣的一個示例類對象
您甚至不需要將數據初始化爲零的函數。 只要寫
matrices::simple<int> matrix_object(6, 6);
獲得尺寸的6x6的初始化爲零的矩陣。
現在,你可以通過
matrix_object(0,1) = 2; // sets 2nd element of first row to 2
矩陣寫入流的「C++辦法」訪問內容將包括定義operator<<
該類像:
template<typename T>
std::ostream & operator<< (std::ostream &stream, matrices::simple<T> const & matrix)
{
typedef typename matrices::simple<T>::size_type size_type;
for (size_type i(0u); i<matrix.rows(); ++i)
{
for (size_type j(0u); j<matrix.cols(); ++j)
stream << std::setw(4) << std::right << matrix(i,j);
stream << std::endl;
}
return stream;
}
您可以輕鬆地輸出您的矩陣通過這種方式寫作:
std::cout << matrix_object << std::endl;
加上以前的snip PTES這將輸出:
0 2 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
如果你想繼續走你就必須解決在代碼中幾個問題的指針。 我已經添加了兩個參數來啓用其他尺寸,但如果需要可以再次替換爲6。
int** new_initialized_array (size_t const rows, size_t const cols)
{
typedef int* rollarray;
rollarray *m = new rollarray[rows];
size_t allocated_arrays(0u);
try
{
for (size_t i(0u); i < rows; ++i)
{
m[i] = new int[cols];
++allocated_arrays;
for (size_t j(0u); j<cols; ++j) m[i][j] = 0;
}
}
catch (std::bad_alloc & e)
{
for (size_t i(0u); i < allocated_arrays; ++i) delete[] m[i];
delete[] m;
throw;
}
return m;
}
的問題我解決:
- 要返回一個指針,該函數必須有一個返回類型,實際上是一個指針(長是一個無符號值)。
- 你需要跟蹤你的分配。如果其中一個失敗,則需要將其餘部分回滾以避免內存泄漏。
- 你不需要double-while循環。你的外部循環已經存在了(你配置的那個),所以你只需要一個內部循環來爲你的數組設置初始值。
- 最後但並非最不重要我重命名的功能。它實際上不是「初始化」現有的數組,而是創建一個新的初始化數組。
我只能推薦閱讀上面的鏈接(或任何其他關於如何根據RAII處理2D數據的資源)。
這是C++不使用指針,使用STL容器 – aaronman
你可以只傳遞一個指針;在你當前的情況下,你使用局部變量'* m'並返回它是無意義的。 – ludesign
你的'return'語句或你的out參數在哪裏?沒有一個或另一個就很難返回任何東西。 – jxh