通过步骤迭代一维数组和二维数组

时间:2014-03-26 10:12:48

标签: c++ arrays

使用步骤3迭代1D数组(伪2D):

arr = new int[height * width * 3];
for (int i = 0; i < height * width * 3; i+=3) {
  arr[i] = 1;   
}

我试过这个,但我得到的是三分之一的专栏:

for (int y = 0; y < height * 3; y++) {
    for (int x = 0; x < width; x+=3) {
        arr[x + width * y] = 1;
    }
}

2 个答案:

答案 0 :(得分:2)

假设您的手机有一个大小的&#39;在3个条目中,您应该在内循环上使用* 3。否则你会错过每行三分之二的单元格。 您还需要将width乘以3以获得正确的行。

for (int y = 0; y < height; y++) {
    for (int x = 0; x < width * 3; x+=3) {
        arr[x + width * 3 * y] = 1;
    }
}

一般情况下,您需要以下结构:

for (int y = 0; y < height; y++) {
    for (int x = 0; x < width * cellWidth; x+= cellWidth) {
        arr[x + width * cellWidth * y] = 1;
    }
}

(在您的情况下cellWidth为3)

为了略微简化这一点,您可以在循环中假设您的单元格的宽度为1(与正常情况一样),并在实际分配值时乘以cellWidth

for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        int index = (x + width * y) * cellWidth;
        arr[index + 0] = 1; // First 'cell entry'
        arr[index + 1] = 1; // Second
        ...
        arr[index + cellWidth - 1] = 1; // Last
    }
}

另一种解决方案是创造更大的物品。使用struct例如:

typedef struct { int r, int g, int b } t_rgb;
t_rgb* arr = new t_rgb[height * width];
for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        arr[x + width * y].r = 1;
    }
}

并且您可以将它用作常规数组(编译器会为您完成所有计算)。这也使您的代码中发生的事情变得更加清晰。

答案 1 :(得分:1)

你想要完成什么?在RGB图像中设置通道? 我通常这样做:

for (int y = 0; y < height; y++)
    for (int x = 0; x < width; x++)
        arr[(x + width * y) * 3] = 1;

通常,要设置RGB值,您只需添加如下偏移量:

for (int y = 0; y < height; y++)
    for (int x = 0; x < width; x++)
    {
        size_t base = (x + width * y) * 3;
        arr[base + 0] = r;
        arr[base + 1] = g;
        arr[base + 2] = b;
    }