首页 > 解决方案 > c++ 为服装类创建一个常量迭代器

问题描述

我有一个自定义模板类 -

template <class T>
class myClass{
    vector<vector<T>> matrix;
    //rest of the code...
};

我希望能够有一个常量迭代器开始到 myClass,常量迭代器结束到 myClass,它能够迭代 myClass 矩阵中的对象 T,我正在努力创建这样的东西。

在我看来,我想将矩阵上的所有对象 T 收集到某个局部一维向量并将 iterator.begin 返回到该向量或将 iterator.end 返回到该向量

此外,我希望能够支持 for-each 循环,如下所示:

for(const auto& obj : instaceOfMyClass)

谢谢!

标签: c++templatesiteratorconst-iterator

解决方案


在我看来,我想将矩阵上的所有对象 T 收集到某个局部一维向量并将 iterator.begin 返回到该向量

这意味着复制整个矩阵。一个很大的禁忌。不仅因为复制的时间,空间的有效加倍,还因为您将在两个位置复制元素。当一个被修改时,另一个保留旧值。

你有两个选择:

扁平化矩阵存储

template <class T>
class myClass{
    vector<T> matrix;

    T& get(size_t line, size_t column)
    {
         return matrix[line * columns_count + column];
    }
};

这有两个好处:更好的缓存局部性和易于实现的迭代器:

using ConstIterator = std::vector<T>::const_iterator;

ConstIterator cbegin() const { return matrix.cbegin(); }

实现迭代器

如果要保留 2dim 存储,则需要实现迭代器。对于我的口味来说,这有点太多的样板,所以如果你想走这条路,我会给你一个指导,让你开始:

迭代器应该保留一个指向矩阵的指针/引用、指向当前行的指针/引用/索引和指向当前列的指针/引用/索引。在++操作时,在列上进行下一步,如果您到达列的末尾,则增加行并重置列。


推荐阅读