是否可以在模板类中的 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]