跟随整数索引列表的自定义类迭代器
Custom class iterator following a list of integer indices?
我有一个模板类myClass
,它拥有一个std::vector
的实例,并且我重载了[]
运算符,以成员向量上的索引std::vector<int>
作为参数,并返回一个辅助类mySubset
template <typename _type>
class myClass {
// ...
std::vector<_type> data;
// ...
class mySubset {
myClass<_type>* mc;
const std::vector<int>::iterator &idx;
public:
//constructor
mySubset(myClass<_type> * _m, const std::vector<int>& _idx);
// input operator overloads (for data and range input)
template <typename _input_type> mySubset& operator=(const std::vector<_input_type>& _vals);
mySubset& operator=(const mySubset& _sbst);
};
public:
myClass();
~myClass();
// ...
//acess operator
mySubset operator[](const std::vector<int>& _idx) { return mySubset(_idx); };
// ...
//iterator
typename std::vector<_type>::iterator begin() {return data.begin();};
typename std::vector<_type>::iterator end(); {return data.end(); };
// ...
}
我可以直接使用[]
运算符获取和设置值,但我希望能够使用基于范围的循环,例如
// ...
myClass<float> foo;
// ...
std::vector<int> indices (3);
indices[0] = 3;
indices[1] = 6;
indices[2] = 10;
// ...
foo[indices] = std::vector<float> (3, 0.47);
for (auto& fval : foo[indices]) { /* do stuff*/}
根据我收集到的信息,我需要advance( InputIt& it, Distance n );
来实现我想要的,并向mySubset
添加begin()
和end()
成员,它们返回一个类似迭代器的类型对象,++
操作符通过查看索引向量来递增迭代器:
class myIterator {
mySubset * sb;
std::vector<_type> it; // myClass::data iterator
public:
myIterator(mySubset * _sb, int pos): sb(_sb) { it = sb->mc->data.begin() + sb->idx[0]; } ;
myIterator& operator++() { };
myIterator& operator!=(myIterator& _other) { };
};
//.. mySubset
myIterator begin();
myIterator end();
但目前我很难理解实现这一目标所需的实际语法是什么?
我会很懒。
转到并在mySubset
上实现_type& operator[](size_t)
和.size()
。
template<class C>
struct range_for_helper{
using self=range_for_helper;
C* c=0;
std::size_t i = 0;
self(C* cin, std::size_t idx):c(cin),i(idx){}
friend bool operator==(self lhs, self rhs){return lhs.i==rhs.i;}
friend bool operator!=(self lhs, self rhs){return lhs.i!=rhs.i;}
void operator++(){++i;}
decltype(auto) operator*(){ return (*c)[i]; }
};
然后添加
到CCD_ 15并完成。
它不是一个真正的迭代器,但对于for(:)
循环来说已经足够了。它可以扩展到一个真正的迭代器,有点像我说的,懒惰。
还有:
range_for_helper<mySubset> begin() const { return {this,0}; }
range_for_helper<mySubset> end() const { return {this,size()}; }
如果您的[]
为const
过载,则仅起作用,所以这很好。
相关文章:
- 如何在创建自定义迭代器时获得 std::p air 的第一个和第二个?
- 无法使用自定义迭代器进行排序
- 指向临时对象的自定义迭代器(延迟加载)
- MSVC++ 17 std::copy 期望自定义迭代器的"operator -"
- 如何使用提升范围将自定义迭代器封装在函数中
- 如何将 std::num_put 与自定义迭代器一起使用?
- 自定义迭代器:如果 a 和 b 的行为不同,如何正确处理距离计算和相等比较
- std::sort 在我的自定义迭代器上不起作用
- 定义将函数调用到传递的元素的自定义迭代器
- C++17 pimpl 习语上下文中的自定义迭代器
- C++自定义迭代器和(*this)
- 如何使用自定义迭代器使用std :: lower_bound
- 自定义迭代器而不是解释问题
- 基于范围的自定义迭代器:constness问题
- 在自定义双链接列表中的自定义迭代器的取消运算符,找不到二进制操作员
- 创建自定义迭代器结构以与CSTDIO一起使用
- 矩阵类的C 自定义迭代器
- 自定义迭代器越界
- 矢量<struct>的自定义迭代器
- 我的自定义迭代器有什么问题