如何解决是否可以在模板类中的 3D 矩阵上使用迭代器?C++
我正在尝试在动态分配的 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]
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。