C++ 什么';这是在c+中声明和初始化(大型)二维对象数组的正确方法+;?

C++ 什么';这是在c+中声明和初始化(大型)二维对象数组的正确方法+;?,c++,multidimensional-array,initialization,declaration,C++,Multidimensional Array,Initialization,Declaration,我需要创建一个大的二维对象数组。我在这个网站上读到了一些相关的问题,还有一些关于多维数组、矩阵、向量等的问题,但还没有把它们放在一起。如果您建议使用其中一种,请继续翻译下面的代码 一些考虑: 阵列有点大(1300 x 1372) 我可能一次要处理多个这样的问题 我必须在某个时刻将其传递给函数 速度是一个很大的因素 我想到的两种方法是: Pixel pixelArray[1300][1372]; for(int i=0; i<1300; i++) { for(int j=0; j

我需要创建一个大的二维对象数组。我在这个网站上读到了一些相关的问题,还有一些关于多维数组、矩阵、向量等的问题,但还没有把它们放在一起。如果您建议使用其中一种,请继续翻译下面的代码

一些考虑:

  • 阵列有点大(1300 x 1372)
  • 我可能一次要处理多个这样的问题
  • 我必须在某个时刻将其传递给函数
  • 速度是一个很大的因素
我想到的两种方法是:

Pixel pixelArray[1300][1372];
for(int i=0; i<1300; i++) {
    for(int j=0; j<1372; j++) {
        pixelArray[i][j].setOn(true);
        ...
    }
}
像素像素阵列[1300][1372];
对于(int i=0;i如果您想将其传递给函数,我会投票反对使用简单数组。请考虑:

void doWork(Pixel array[][]);
这不包含任何大小信息。您可以通过单独的参数传递大小信息,但我更愿意使用std::vector之类的内容。当然,这需要您定义一个寻址约定(行主或列主)

另一种选择是std::vector,其中每一级向量都是一个数组维度。优点:类似于pixelArray[x][y]中的双下标工作正常,但创建这样一个结构非常繁琐,复制成本更高,因为复制是针对每个包含的向量实例进行的,而不是使用简单的memcpy,并且顶级向量中包含的向量不一定具有相同的大小

这些基本上是您使用标准库的选项。正确的解决方案是类似于二维std::vector的东西。我们想到了数字库和图像处理库,但矩阵和图像类很可能仅限于其元素中的原始数据类型


编辑:忘了说明上面的所有内容都只是论点。最后,你的个人品味和背景都必须考虑在内。如果你自己在项目中,vector plus定义和记录的寻址约定应该足够好。但是如果你在一个团队中,很可能有人会忽视按照惯例,向量结构中的级联向量可能更好,因为繁琐的部分可以由辅助函数实现。

如果您想将其传递给函数,我反对使用简单数组。请考虑:

void doWork(Pixel array[][]);
这不包含任何大小信息。您可以通过单独的参数传递大小信息,但我更愿意使用std::vector之类的内容。当然,这需要您定义一个寻址约定(行主或列主)

另一种选择是std::vector,其中每一级向量都是一个数组维度。优点:类似于pixelArray[x][y]中的双下标工作正常,但创建这样一个结构非常繁琐,复制成本更高,因为复制是针对每个包含的向量实例进行的,而不是使用简单的memcpy,并且顶级向量中包含的向量不一定具有相同的大小

这些基本上是您使用标准库的选项。正确的解决方案是类似于二维std::vector的东西。我们想到了数字库和图像处理库,但矩阵和图像类很可能仅限于其元素中的原始数据类型


编辑:忘了说明上面的所有内容都只是论点。最后,你的个人品味和背景都必须考虑在内。如果你自己在项目中,vector plus定义和记录的寻址约定应该足够好。但是如果你在一个团队中,很可能有人会忽视按照文献记载的惯例,向量结构中的级联向量可能更好,因为繁琐的部分可以由助手函数实现。

您的第一种方法分配堆栈上的所有内容,这在其他方面都很好,但当您尝试分配太多堆栈时,会导致堆栈溢出。在现代系统中,限制通常在8兆字节左右操作系统,所以在堆栈上分配1300*1372个元素的数组不是一个选项

第二种方法是在堆上分配1300*1372个元素,这对分配器来说是一个巨大的负载,它将多个链表保存到分配的和可用的内存块中。这也是一个坏主意,特别是因为像素似乎很小

我要做的是:

Pixel* pixelArray = new Pixel[1300 * 1372];
for(int i=0; i<1300; i++) {
    for(int j=0; j<1372; j++) {
        pixelArray[i * 1372 + j].setOn(true);
        ...
    }
}
Pixel*pixelArray=新像素[1300*1372];

对于(int i=0;i您的第一种方法是分配堆栈上的所有内容,否则这很好,但当您尝试分配太多堆栈时会导致堆栈溢出。在现代操作系统上,限制通常在8兆字节左右,因此在堆栈上分配1300*1372个元素的数组不是一个选项

第二种方法是在堆上分配1300*1372个元素,这对分配器来说是一个巨大的负载,它将多个链表保存到分配的和可用的内存块中。这也是一个坏主意,特别是因为像素似乎很小

我要做的是:

Pixel* pixelArray = new Pixel[1300 * 1372];
for(int i=0; i<1300; i++) {
    for(int j=0; j<1372; j++) {
        pixelArray[i * 1372 + j].setOn(true);
        ...
    }
}
Pixel*pixelArray=新像素[1300*1372];

对于(int i=0;i我不确定您的像素数据类型有多复杂,但类似的东西可能适合您:

std::fill(数组,数组+100,42);//将数组中的每个值设置为42

参考:

我不确定您的像素数据类型有多复杂,但类似的东西可能适合您:

std::fill(数组,数组+100,42);//将数组中的每个值设置为42

参考:

查看Boost的通用图像库

gray8_image_t pixelArray;
pixelArray.recreate(1300,1372);
for(gray8_image_t::iterator pIt = pixelArray.begin(); pIt != pixelArray.end(); pIt++) {
    *pIt = 1;
}

查看Boost的通用图像库

gray8_image_t pixelArray;
pixelArray.recreate(1300,1372);
for(gray8_image_t::iterator pIt = pixelArray.begin(); pIt != pixelArray.end(); pIt++) {
    *pIt = 1;
}

虽然我不一定要将其设置为结构,但这演示了如何存储和访问数据

struct Pixel2D {
  Pixel2D (size_t rsz_, size_t csz_) : data(rsz_*csz_), rsz(rsz_), csz(csz_) {
    for (size_t r = 0; r < rsz; r++)
    for (size_t c = 0; c < csz; c++)
      at(r, c).setOn(true);
  }
  Pixel &at(size_t row, size_t col) {return data.at(row*csz+col);}
  std::vector<Pixel> data;
  size_t rsz;
  size_t csz;
};
struct Pixel2D{
像素2D(大小rsz、大小csz):数据(rsz*csz)、rsz(rsz)、csz(csz){
对于(大小r=0;r