c++ - 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)
谢谢!
解决方案
在我看来,我想将矩阵上的所有对象 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 存储,则需要实现迭代器。对于我的口味来说,这有点太多的样板,所以如果你想走这条路,我会给你一个指导,让你开始:
迭代器应该保留一个指向矩阵的指针/引用、指向当前行的指针/引用/索引和指向当前列的指针/引用/索引。在++
操作时,在列上进行下一步,如果您到达列的末尾,则增加行并重置列。
推荐阅读
- reactjs - React-router-dom 仅来自应用程序而不是来自 url 的访问页面
- google-chrome - chrome://webrtc-internal 如何测量往返时间?
- python - 如何将值保存在关联数组中?
- google-apps-script - Google App Scripts:如何根据单元格中的值将一行复制到新选项卡中的下一个可用行
- ios - 登录错误:操作无法完成。(com.facebook.sdk.core 错误 3。)斯威夫特
- apache-flink - Flink:如何使用键/值存储转换 DataStream?
- javascript - 如何补间/动画雾three.js
- python - smooth_l1_loss 函数如何处理张量?
- sql - GridDB 是否支持过程 Sql (PL/SQL)?
- java - 如何区分被转换为不同子类对象的父类?