我有这个多维动态数组,我可以将它打印成六行六列零,但我不能将它作为相同的返回。该函数应该初始化一个可以传递给其他函数的数组。我在这做错了什么?我评论了“cout”部分,因为那不是我需要做的。谢谢!
long initializeArray (void)
{
int i = 0, j = 0;
typedef int* rollarray;
rollarray *m = new rollarray[6];
for (int i = 0; i < 6; i++) m[i] = new int[6];
while (j < 6)
{
while (i < 6)
{
m[i][j] = 0;
//cout << m[i][j] << " ";
i++;
}
//cout << endl;
i = 0;
j++;
}
}
答案 0 :(得分:4)
您应该声明您的功能:
int** initializeArray(void)
然后:
return m;
最后,如果你必须这样做的话。不要忘记你必须手动告诉使用这个指针的任何其他东西它是一个6 x 6阵列,并且当你完成它们时不要忘记delete[]
所有这些阵列。
答案 1 :(得分:2)
我不会重复我的完整答案,为什么动态二维矩阵(这显然是一个)不是用C ++的方式。
Answer on: 1D or 2D array, what's faster?(开始阅读@ 长答案,或为什么动态二维数据存储(指向指针或矢量矢量)对于简单/小矩阵来说是“坏”。 / em>的)
你会发现:
您甚至不需要将数据初始化为零的函数。 只需写下
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;
与之前的snipptes一起输出:
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;
}
我提出的问题:
我只能建议阅读上面的链接(或任何其他有关如何根据RAII处理2D数据的资源)。
答案 2 :(得分:2)
C ++:)
#include <vector>
#include <iostream>
std::vector<std::vector<int> > initializeVector() {
std::vector<std::vector<int> > vec(6, std::vector<int>(6));
int i = 0, j = 0;
while (i < 6) {
while (j < 6) {
vec[i][j] = i+j;
j++;
}
j = 0;
i++;
}
return vec;
}
int main(int argc, char* argv[]) {
std::vector<std::vector<int> > g_vec = initializeVector();
int i = 0, j = 0;
while (i < 6) {
while (j < 6) {
std::cout << g_vec[i][j] << std::endl;
j++;
}
std::cout << "-----------------" << std::endl;
j = 0;
i++;
}
return 0;
}
答案 3 :(得分:1)
这是家庭作业吗?或者您是否尝试在C ++中使用Matrix Algebra?
如果不是作业,那么首先检查是否存在更容易使用的东西,并且性能更高。 Pixelchemist取得了不错的成绩,因此您应该能够使用其他人的代码为您完成工作。
查看Eigen库:http://eigen.tuxfamily.org/dox/TutorialAdvancedInitialization.html
// Initializing a 6x6 dynamic size matrix with zeros, adapted from documentation
using namespace Eigen;
ArrayXXf a3 = ArrayXXf::Zero(6, 6);
std::cout << a3 << "\n";