我试图为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
答案 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
重载。