我不会重复我的完整答案,为什么动态二维矩阵(这显然是一个)不是在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