【问题标题】:c++ creating an const iterator for a costum classc ++为自定义类创建一个常量迭代器
【发布时间】:2020-09-27 05:07:48
【问题描述】:

我有一个自定义模板类 -

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

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

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

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

for(const auto& obj : instaceOfMyClass)

谢谢!

【问题讨论】:

标签: c++ templates iterator const-iterator


【解决方案1】:

在我看来,我想将矩阵上的所有对象 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 存储,则需要实现迭代器。对于我的口味来说,这有点过多的样板,所以如果你想走这条路,我会给你一个指导,让你开始:

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

【讨论】:

  • 我的投票是支持,并且只支持您的这一点:扁平化矩阵存储
  • 假设我想保留我的 2dim 数组存储,我的迭代器是否需要保存指向 2d 矩阵的指针?否则,我怎么知道我是否已到达行尾行/列...?
猜你喜欢
  • 2011-07-09
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 2021-08-11
相关资源
最近更新 更多