4

如果您可以使用指针来遍历这样的数组:

for (int *iter = arr; iter != std::end(arr); ++iter) {
    // code
}

您如何使用指针(不使用)遍历多维数组auto

编辑:我假设这是一个int[][]诸如{{3, 6, 8}, {2, 9, 3}, {4, 8, 2}}

4

6 回答 6

7

如果您将数组声明为 arr[][],是的,您可以,因为它们是按顺序存储在内存中的。你可以做:

for(int * iter = &arr[0][0]; iter != &arr[0][0] + col * row; iter++)
//...
于 2013-09-20T15:18:55.720 回答
1

像这样尝试怎么样: -

const int* d = data;
for ( int i = 0; i < width; ++i )
    for ( int j = 0; j < height; ++j )
        for ( int k = 0; k < depth; ++k )
            sum += *d++;

检查本教程

于 2013-09-16T20:42:39.627 回答
1

例如:

constexpr size_t rowCnt = 3, colCnt = 4;

int ia[rowCnt][colCnt] = { // three elements; each element is an array of size 4
     {0, 1, 2, 3}, // initializers for the row indexed by 0
     {4, 5, 6, 7}, // initializers for the row indexed by 1
     {8, 9, 10, 11} // initializers for the row indexed by 2
    };

不对循环控制变量的类型使用类型别名:

// p points to the first array in ia
for (int (*p)[colCnt] = ia; p != ia + rowCnt; ++p) {
    // q points to the first element of an array of four ints; that is, q points to an int
    for (int *q = *p; q != *p + colCnt; ++q)
        cout << *q << " ";
    cout << endl;
}

或更容易使用auto

for (auto p = ia; p != ia + rowCnt; ++p) {
    // q points to the first element of an array of four ints; that is, q points to an int
    for (auto q = *p; q != *p + colCnt; ++q)
        cout << *q << " ";
    cout << endl;
}
于 2013-10-26T13:36:24.400 回答
0

sizeof假设数组是静态分配的(在编译时已知维度) ,for(int * iter = &arr[0][0]; iter != &arr[0][0] + sizeof(arr)/sizeof(int); iter++) 或者iter != (int*)((void*)&arr[0][0] + sizeof(arr))如果您是 (void*) 粉丝并且讨厌任何编译时划分

所以你不必担心数组维度:)

于 2015-08-30T16:32:32.573 回答
-1

大概是这样的

   for (int **iter = arr; iter != std::end(arr); ++iter) {
        for (int *iter2 = *iter; iter2 != std::end(*arr); ++iter2) {
        // code
        }
    }
于 2013-09-16T20:47:57.693 回答
-1

假设您只是在谈论静态声明的多维数组:

const int ROWS = 10;
const int COLS = 20;
const int DEPTH = 30;
int array[ROWS][COLS][DEPTH]; // statically allocated array
int i = 0;
for (int row = 0; row < ROWS; ++row)
{
    for (int col = 0; col < COLS; ++col)
    {
        for (int depth = 0; depth < DEPTH; ++depth)
        {
            *(*(*(array + row) + col) + depth) = i++; // do whatever with it
            // is equivalent to array[row][col][depth] = i++;
        }
    }
} 

如果您需要更多级别,您只需不断添加指针间接级别。

或者:

const int ROWS = 5;
const int COLS = 6;
const int DEPTH = 3;
int array[ROWS][COLS][DEPTH]; // statically allocated array
int* p = &array[0][0][0];
int c = 0;
for (int i = 0; i < ROWS * COLS * DEPTH; ++i, p++)
{
    *p = c++;
}

由于静态声明的数组在内存中是连续的,第一个元素 ( array[0][0][0]) 从基地址 ( &array) 开始,所以这是可行的。

动态声明一个多维数组将是一个指向指向(等)的指针数组的指针,指向指向object_type. 您可以使用std::vectoror来简化它std::array(如果您在编译时知道大小)。

并不是说这些使用指针进行迭代(至少不是直接的),而是

向量/数组

std::vector<std::vector<std::vector<int> > > array;
// or
//std::array<std::array<std::array<int, DEPTH>, COLS>, ROWS> array; // with some slight modifications
// fill in the vectors/arrays however you want

std::for_each(array.begin(), array.end(), [](const std::vector<std::vector<int> >& v)
{
    std::for_each(v.begin(), v.end(), [](const std::vector<int>& a)
    {
        std::for_each(a.begin(), a.end(), [](int i)
        {
            std::cout << i << endl;
        });
    });
});
于 2013-09-16T21:04:40.767 回答