用于c ++的自定义迭代器函数

时间:2017-11-29 10:58:57

标签: c++ function c++11 vector iterator

我有一个" 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 ++概念相当新。有人能帮助我吗?

2 个答案:

答案 0 :(得分:0)

迭代器是可复制的。

你可以

  • 派生自容器的容器迭代器,
  • 从容器的迭代器添加构造
  • 添加额外的属性成员
  • 并声明自定义容器中的begin(),end()等返回派生的迭代器。

答案 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;
    }
}