c++ - 自定义迭代器包装另一个迭代器 : iterating past the underlying end iterator without checking?

标签 c++ iterator

我实现了一个迭代器包装类,它每走一步都会将底层 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/

相关文章:

c++ - 有什么方法可以使用c++和wxwidget来实现类似于wpf扩展器的功能

c++ - Windows 7 和 Windows 8 进程 "ring"控件

c++ - QTcpSocket : selecting source interface using bind() for connection to remote host with connectToHost(): need a workaround

c++ - 在 Windows X 按钮上单击并按住鼠标时 WM_TIMER 消息被抑制

string - 从字符串创建字符切片的滑动窗口迭代器

Python如何部分消耗可迭代生成器(没有 `next` )?

c++ - 我可以通过整数索引访问 C++ std::map 中的元素吗?

android - 构建 Android 应用程序时禁用 CMake 目标

c++ - 为什么从采用 std::ranges::output_range 的算法返回 std::ranges::safe_iterator_t 而不是 std::ranges::safe_subrange_t

c++ - 从指针或引用获取迭代器