我实现了一个迭代器环绕类,它为每一个步骤移动一个基础的random_access_iterator
一定量/步幅S
。包装另一个迭代器的自定义迭代器:迭代通过基础结束迭代器而不检查?
Wrapper<Iterator> + i === Iterator + i*S
它合奏 “每N个元件迭代” 的某种。
的基本思想是遍历列或对角线一个连续存储矩阵的:
/*
0 1 2
3 4 5
6 7 8
*/
随着S为4我们可以迭代使用Wrapper
[Wrapper::begin]=0 -> 4 -> 8 -> 12=[Wrapper::end]
或第二列中的对角线与S=3
[Wrapper::begin]=1 -> 4 -> 7 -> 10=[Wrapper::end]
它几乎很多作品的问题在于迭代器的end
。由此产生的end()
迭代器可能是> last+1
(UB?)。
如果选中的迭代器与Wrapper
一起使用,将会失败,因为它们将检测到最后一步超出了基础迭代范围的有效范围[begin,end]
。
有任何理智的,高性能的方式来解决这个问题,不是使Wrapper
本身某种检查迭代器即方含的有效end
参考其他:
Wrapper<Iterator> & operator++()
{
m_it += std::min(S, std::distance(m_it, m_end));
return *this;
}
与
Wrapper<Iterator> & operator++()
{
m_it += S;
return *this;
}
?
FYI:这里是[第一部分(http://ericniebler.com/2014/02/16/delimited-ranges/)由Eric Niebler博客文章的一个有趣的意甲(从升压成名)思考当前迭代器设计的问题,它们的局限性以及可能做出的改进。在他的演示过程中,您会发现有趣的策略来为“非典型”范围(过滤范围,无限范围...)构建迭代器。 –
谢谢,非常翔实! – Pixelchemist