非均匀多维数组的C++迭代

C++ Iteration on nonuniform multidimensional arrays

本文关键字:C++ 迭代 数组      更新时间:2023-10-16

考虑以下C++代码示例:

int array_1[] = {5,6,7};
int array_2[] = {6,7,8,9};
int array_3[] = {2,3};
int* meta_array[] = {array_1, array_2, array3};

现在,我想迭代meta_array的子数组中的所有元素,而不会导致seg错误。

当然,问题是我没有办法得到数组的大小来避免超出它们的界限。

我可以用sizeof array_1 / sizeof array_1[0]很快得到一个普通一维数组的大小,但一旦我在meta_array中,每个元素都被转换为一个指针,因此sizeof将返回指针的字节大小,而不是整个数组。因此,sizeof meta_array[0] / sizeof meta_array[0][0]对我的事业并没有多大帮助。

是否已经有了在非均匀多维数组上迭代的标准解决方案,或者我应该继续使用std::vector?

使用std::vector

或者,使用一个"闭合"数字,但必须确保永远不会有具有该值的元素。

int array_1[] = {5,6,7,-1};
int array_2[] = {6,7,8,9,-1};
int array_3[] = {2,3,-1};
int*  meta_array[] = 
{
  array_1, 
  array_2, 
  array_3,
  NULL
};
for(int i=0; meta_array[i] != NULL; ++i)
{
   for(int j=0; meta_array[i][j] != -1; ++j)
       printf("%d",  meta_array[i][j]);
   printf("n");
}

您将从Boost.MultiArray 中获得极大的好处

如果您坚决反对使用vector,您也可以在数组中保持长度:

#include <iostream>
#define ARRSIZE(X) sizeof(X) / sizeof(X[0])
int main() {
    int array_1[] = { 5,6,7 };
    int array_2[] = { 6,7,8,9 };
    int array_3[] = { 2,3 };
    int* meta_array[] = { array_1, array_2, array_3 };
    int meta_array_lengths[] = { ARRSIZE(array_1), ARRSIZE(array_2), ARRSIZE(array_3) };
    for (int outer = 0; outer < ARRSIZE(meta_array); outer++) {
        for (int inner = 0; inner < meta_array_lengths[outer]; inner++) {
            std::cout << meta_array[outer][inner] << " ";
        }
        std::cout << 'n';
    }
    return 0;
}

输出:

5 6 7
6 7 8 9 
2 3