【发布时间】:2014-08-07 12:18:39
【问题描述】:
我实现了一个迭代器包装类,它移动底层random_access_iterator 一定数量/步幅S,每走一步。
Wrapper<Iterator> + i === Iterator + i*S
它集合了某种“每 Nth 个元素迭代器”。
基本思想是遍历列或连续存储矩阵的对角线:
/*
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;
}
?
【问题讨论】:
-
仅供参考:这里是 the first part Eric Niebler(来自 Boost 名声)的一系列有趣的博客文章,他思考了当前迭代器设计的问题、它们的局限性以及可以做出的改进。在他的演示过程中,您会发现为“非典型”范围(过滤范围、无限范围……)构建迭代器的有趣策略
-
谢谢,信息量很大!