返回一个多维动态数组?

时间:2013-07-18 00:01:16

标签: c++ dynamic-arrays

我有这个多维动态数组,我可以将它打印成六行六列零,但我不能将它作为相同的返回。该函数应该初始化一个可以传递给其他函数的数组。我在这做错了什么?我评论了“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++;
    }
}

4 个答案:

答案 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;
}

我提出的问题:

  1. 要返回指针,该函数必须具有实际上是指针的返回类型(long是无符号值)。
  2. 您需要跟踪分配。如果其中一个失败,您将需要回滚其余部分以避免内存泄漏。
  3. 您不需要double-while循环。您已经存在外部循环(您分配的那个),因此您只需要一个内部循环来设置数组的初始值。
  4. 最后但并非最不重要的是我重命名了这个功能。它实际上并不“初始化”现有数组,而是创建一个新的初始化数组。
  5. 我只能建议阅读上面的链接(或任何其他有关如何根据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";