C++ 为 costum 类创建一个 const 迭代器

c++ creating an const iterator for a costum class

本文关键字:一个 const 迭代器 costum 创建 C++      更新时间:2023-10-16

我有一个自定义模板类 -

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

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

在我的脑海中,我想将矩阵中的所有对象 T 收集到某个局部一维向量中,并将迭代器返回

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

for(const auto& obj : instaceOfMyClass)

谢谢!

在我看来

,我想将矩阵中的所有对象T收集到某个局部一维向量中,并将迭代器返回给这个向量

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

您有两种选择:

扁平化矩阵存储

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 存储,那么你需要实现迭代器。对于我的口味来说,这有点太多了,所以如果你想走这条路,我会给你一个指导,让你开始:

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