2D数组的自定义迭代器

时间:2014-12-23 22:40:29

标签: c++ c++11 iterator

我试图为2D数组制作自定义迭代器以按列迭代。我想通过这个测试实现的是操纵2d数组值。 例如,这个脚本产生一个输出:

0 1 2
3 4 5
6 7 8

借助列迭代器和std::reverse我可以操作2d数组来获得这样的输出

6 1 2
3 4 5
0 7 8

但是。同样的结果可以通过std :: swap完成。所以我通过交换重复测试脚本,但它失败了。

我的问题是,任何迭代器类的交换只是虚拟成员函数吗?

template<typename Container>
class Columniterator : public std::iterator<std::random_access_iterator_tag,
    typename std::decay<decltype(std::declval<Container>()[0][0])>::type>
{
    using iterator = typename Container::iterator;
    using  type = typename std::decay<decltype(std::declval<Container>()[0][0])>::type;
public:

    Columniterator(iterator _it, size_t _i)
        : it(_it), i(_i)
    {}

...

很多代码bla bla

...

    void swap(Columniterator& other)
    {
        using std::swap;
        swap(it, other.it);
    }
private:
    iterator it;
    size_t i;
};

测试代码

    //std::reverse(Columniterator<Container>(container.begin(),0), Columniterator<Container>(container.end(), 0)); // passed
    std::swap(Columniterator<Container>(container.begin(),0), Columniterator<Container>(container.end(), 0)); // failed

2 个答案:

答案 0 :(得分:3)

您没有在全球范围内实施swap,而是在课程中实施了swap

如果您实施了正确的swap,则可以使其正常工作。见how to provide a swap function for my class?

答案 1 :(得分:3)

你的测试试图交换临时工;改为使用变量:

auto begin0 = begin(matrix, 0);
auto end0 = end(matrix, 0);

begin0.swap(end0);

或通过右值参考提供swap重载。

相关问题