我实现了一个迭代器包装类,它每走一步都会将底层 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;
}
?
最佳答案
您几乎已经找到了解决方案;由于 STL 迭代器的设计不佳,您想要的迭代器需要同时包含当前迭代器和结束迭代器。
如果唯一的应用程序是迭代连续存储的矩阵,并且迭代器本身绑定(bind)到矩阵(例如列迭代器),并且矩阵不太大,那么您可以简单地确保有一个底层连续内存中的附加行,例如对于 4x4 矩阵,分配 20 个条目。
关于c++ - 自定义迭代器包装另一个迭代器 : iterating past the underlying end iterator without checking?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24264610/