有没有一种方法可以在不使用递归的情况下迭代n维数组(其中n是变量)

Is there a way to iterate over an n-dimensional array (where n is variable) without using recursion?

本文关键字:迭代 情况下 其中 变量 递归 数组 方法 一种 有没有      更新时间:2023-10-16

有没有一种方法可以在不使用递归的情况下迭代n维数组(其中n是变量(?我现在正在使用C++,但我想几乎任何语言的答案都可以。

EDIT:实际上我真正的问题有点不同:我实际上想枚举数组的索引。简单的2D示例,使用2x2数组:0,0;0,1;1,0;1,1.

void iterate(const std::vector<int> &dims)
{
    std::vector<int> idxs(dims.size());
    while (1)
    {
        // Print
        for (int i = 0; i < dims.size(); i++)
        {
            std::cout << idxs[i] << " ";
        }
        std::cout << "n";
        // Update
        int j;
        for (j = 0; j < dims.size(); j++)
        {
            idxs[j]++;
            if (idxs[j] < dims[j]) break;
            idxs[j] = 0;
        }
        if (j == dims.size()) break;
    }
}

是-请记住,C++(或大多数语言(中的任何多维数组都只是一个线性内存区域。该语言只是通过自动将任何外部维度索引乘以该维度的大小/偏移量来帮助您。

因此,您可以"手动"遍历多维数组,方法与编写array[x][y][z]时使用的语言相同,但当然,您可以对任意数量的维度执行此操作。

是。如果数组在内存中是"平面"的,则可以从array迭代到array + n^n
请注意,使用递归的相同解决方案将使用循环+堆栈。(任何递归都可以转换为循环+堆栈(。

编辑:在您编辑您的问题后:正好有m^n(假设每个维度具有相同数量的元素m(,一个简单的枚举将是0,1,。。。,(m^n(-1。通过array + ENUM_NUMBER访问。

我最近写了这个通用帮助程序来散列T.的NxM数组

template <class T, size_t N, size_t M>
    size_t hash(const T (&aa)[N][M])
{
    size_t seed = 0;
    for (size_t i=0; i<N; i++)
        boost::hash_combine(seed, boost::hash_range(aa[i], aa[i]+M));
    return seed;
}

您可以使用相同的要点来迭代任意数组

template <class T, size_t N, size_t M, class F>
    void for_each(const T (&aa)[N][M], F func)
{
    size_t seed = 0;
    for (size_t i=0; i<N; i++)
    for (size_t j=0; j<M; j++)
        func(aa[i][j]);
}
template <class T, size_t N, size_t M, size_t L, class F>
    void for_each(const T (&aaa)[N][M][L], F func)
{
    size_t seed = 0;
    for (size_t i=0; i<N; i++)
    for (size_t j=0; j<M; j++)
    for (size_t k=0; k<L; k++)
        func(aa[i][j][k]);
}

这样使用:

void display(float f) {   std::cout << f << std::endl; }
// ...
float fff[1][2][3];
for_each(fff, display);