2D 数组的自定义迭代器

custom iterator for 2D array

本文关键字:迭代器 自定义 数组 2D      更新时间:2023-10-16

我尝试为 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)
    {}

....

很多代码

等等

....

    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

您没有在全局范围内实现swap,而是在类中实现了swap

如果您实现了适当的swap则可以使其工作。了解如何为我的类提供交换功能?

您的测试尝试交换临时变量;请改用变量:

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

或者使用右值引用提供swap重载。