有没有一种方法可以在不使用递归的情况下迭代n维数组(其中n是变量)
Is there a way to iterate over an n-dimensional array (where n is variable) without using recursion?
有没有一种方法可以在不使用递归的情况下迭代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);
相关文章:
- 我可以在没有堆栈的情况下在二叉搜索树中实现迭代器吗?
- 在无法访问向量的情况下查找迭代器的末尾
- 在不使用vector.end()的情况下迭代std::vector
- 如何在不迭代的情况下对数组中的每个元素调用方法
- 我怎样才能在不重复的情况下随机迭代向量的每个元素
- 如何在没有迭代器的情况下使用 std::for_each + std::execution::p ar?
- 如何在不迭代的情况下从string_view向量创建字符串向量?
- 是否可以在不显式迭代每个元素的情况下深度复制指针容器?
- 有没有办法在不使用任何迭代的情况下将字符的字母顺序排列
- 在这种情况下,可以比较无效的迭代器
- 如何在不使用循环或迭代器的情况下检查所有列表元素并在满足条件时删除一个
- 如何迭代在不知道其大小的情况下读取的字符串?
- 如何在给定迭代器列表的情况下从向量中删除元素
- 如何在没有原因(有输入)的情况下修复迭代;在 c++ 中?
- 有没有办法在不使用两个 for 循环的情况下迭代两个容器
- Python 对象不可迭代或下标
- 在给定迭代器的情况下检索容器的比较函数
- 如何在没有最后一个元素的情况下迭代列表
- 切换情况下映射迭代器的交叉初始化
- 如何在不使用迭代器的情况下在 C++ 中打印地图