问题描述
我正在尝试在动态分配的 3d 矩阵上使用迭代器。
matrix = new T**[height];
for(int i =0; i<height; i++){
matrix[i] = new T*[col];
for(int j =0; j<col; j++){
matrix[i][j] = new T[row];
}
}
是否可以使用迭代器迭代这个矩阵?还是使用迭代器选择不同的解决方案更好? (无矢量解)
如果可能,我该如何实现它们?
解决方法
每个指针也满足迭代器的条件。所以你可以迭代如下:
for(T*** begin1 = matrix,end1 = matrix + height; begin1 != end1; ++begin1)
{
for(T** begin2 = *begin1,end2 = *begin1 + col; begin2 != end2; ++begin2)
{
for(T* begin3 = *begin2,end3 = *begin2 + row; begin3 != end3; ++begin3)
{
begin3->doSomething();
}
}
}
这也适用于标准库算法:
std::for_each
(
matrix,matrix + height,[](T** t)
{
std::for_each
(
t,t + col,[](T* t)
{
std::for_each
(
t,t + row,[](T& t)
{
t.doSomething();
}
);
}
);
}
);
未经测试的代码,如果您发现错误,请自行修复。
不过,使用 std::vector
可能会更好,这使您免于所有手动内存管理,并且还允许更简单的构造:
std::vector<std::vector<std::vector<T>>> v
(
height,std::vector<std::vector<T>>(col,std::vector<T>(row)
);
如果您出于某种原因不需要锯齿状数组,如果您将所有值放入一维数组/向量中并自行进行索引计算,您将获得更高效的代码,那么 [x][y][z]
对应到[(x * col + y) * row + z]
。