我有一个" T"类型的对象的集合。我想要迭代。对象类型" T"有两个重要的属性:
int r; // row number
int c; // column number
我想定义一个迭代器,它允许我遍历集合的所有元素。
这可以使用:
完成std::vector<T> v;
for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it) {
....
}
但是,我希望迭代器还有一个属性。我希望能够致电
it.nextrow()
调用此函数应返回元素&#34; e&#34; of v其中e.r + 1 = ec.r和e.c = ec.c,其中ec是迭代器指向的当前元素。即调用it.nextrow()应该给我一个指向列相同的元素的指针,但是行加一。希望它有意义。
我不确定我需要做什么才能使其工作,因为我对高级c ++概念相当新。有人能帮助我吗?
答案 0 :(得分:0)
迭代器是可复制的。
你可以
答案 1 :(得分:0)
假设您的数据打包在一个向量中,该向量包含行的所有列的连续项,后跟下一行的项,您只需要*(iterator + column_count)
来访问下一行 - 同一列值(don不要在已经指向最后一行数据的迭代器上尝试这个)
您可以创建类似于Implement custom iterator for c++ std container的包装器迭代器,并为其提供特定列数作为附加信息:
template<typename T, int colsize, typename TIterator = std::vector<T>::iterator>
class MyRowIterator : public std::iterator<std::forward_iterator_tag, T>
{
private:
TIterator m_pter;
public:
MyRowIterator(TIterator& value): m_pter(value)
{
}
MyRowIterator(const MyRowIterator& other_it): m_pter(other_it.m_pter)
{
}
MyRowIterator& operator++()
{
++m_pter;
return *this;
}
bool operator!=(const MyRowIterator& rhs)
{
return m_pter != rhs.m_pter;
}
T& operator*()
{
return (*m_pter);
}
// here it is
T& nextrow()
{
return *(m_pter+colsize);
}
};
用法示例:
void Test()
{
std::vector<int> data;
// 2 rows each 10 columns
data.resize(20);
for (auto& item : data)
{
item = 0;
}
data[2] = 1;
data[12] = 5;
// don't iterate the last line, else nextrow() will access out of bounds!
for (MyRowIterator<int, 10> iter = data.begin(); iter != (data.end()-10); iter++)
{
std::cout << *iter << " # " << iter.nextrow() << std::endl;
}
}