猿问

如何在c+中创建连续的2d数组?

如何在c+中创建连续的2d数组?

我想要创建一个函数,在C+中返回一个连续的2D数组。

使用以下命令创建数组没有问题:

 int (*v)[cols] = new (int[rows][cols]);

但是,我不知道如何将这个数组作为函数的一般类型返回。其职能是:

  NOT_SURE_WHAT_TYPE create_array(int rows, int cols)
  {
        int (*v)[cols] = new (int[rows][cols]);
        return v;
  }

我试过双倍和双倍,但两者都不起作用。我不想使用Double*,因为我想以2D数组的形式从外部访问这个数组。

有关问题:如何使用New在C+中声明2d数组?


紫衣仙女
浏览 561回答 3
3回答

慕娘9325324

除非在编译时知道两个维度的大小,否则您没有太多的选择:分配一个rows*cols数组intS,并使用整数乘法和加法滚动您自己的2D索引。将其封装在类中可以生成一个漂亮的语法,用于使用方括号运算符访问数组元素。因为您的数组是2D的,所以您需要使用代理(AKA“代理”)对象进行第一级数据访问。下面是一个小示例代码,它使用std::vector<T>用于维护动态内存中的连续内存区域:template<class&nbsp;T>class&nbsp;Array2D&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;vector<T>&nbsp;data; &nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;cols;public: &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;This&nbsp;is&nbsp;the&nbsp;surrogate&nbsp;object&nbsp;for&nbsp;the&nbsp;second-level&nbsp;indexing &nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;<class&nbsp;U> &nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;Array2DIndexer&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;offset; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vector<U>&nbsp;&data; &nbsp;&nbsp;&nbsp;&nbsp;public: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Array2DIndexer(size_t&nbsp;o,&nbsp;vector<U>&nbsp;&dt)&nbsp;:&nbsp;offset(o),&nbsp;data(dt)&nbsp;{} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Second-level&nbsp;indexing&nbsp;is&nbsp;done&nbsp;in&nbsp;this&nbsp;function &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&&nbsp;operator[](size_t&nbsp;index)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;data[offset+index]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;&nbsp;&nbsp;Array2D(size_t&nbsp;r,&nbsp;size_t&nbsp;c)&nbsp;:&nbsp;data&nbsp;(r*c),&nbsp;cols(c)&nbsp;{} &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;First-level&nbsp;indexing&nbsp;is&nbsp;done&nbsp;in&nbsp;this&nbsp;function. &nbsp;&nbsp;&nbsp;&nbsp;Array2DIndexer<T>&nbsp;operator[](size_t&nbsp;index)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Array2DIndexer<T>(index*cols,&nbsp;data); &nbsp;&nbsp;&nbsp;&nbsp;}};你现在可以用Array2D<int>就好像它是内置的C+数组:Array2D<int>&nbsp;a2d(10,&nbsp;20);for&nbsp;(int&nbsp;r&nbsp;=&nbsp;0&nbsp;;&nbsp;r&nbsp;!=&nbsp;10&nbsp;;&nbsp;r++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;c&nbsp;=&nbsp;0&nbsp;;&nbsp;c&nbsp;!=&nbsp;20&nbsp;;&nbsp;c++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a2d[r][c]&nbsp;=&nbsp;r+2*c+1; &nbsp;&nbsp;&nbsp;&nbsp;}}在IDONE上运行演示.
随时随地看视频慕课网APP
我要回答