c++ - 如何在运行时选择迭代器方向

标签 c++ iterator

我想选择在运行时遍历容器的方向,如以下示例代码所示:

#include <iostream>
#include <vector>

void iterate(bool forward, std::vector<int> v) {
  auto start = v.begin();
  auto end = v.end();
  if (!forward) {
    start = v.rbegin(); // this doesn't
    end = v.rend();     // work
  }

  for (auto it = start; it != end; ++it) {
    std::cout << *it << " -> " << *std::next(it) << std::endl;
  }
  std::cout << std::endl;
}

int main() {
  std::vector<int> v{1, 2, 3, 4, 5};
  iterate(true, v);
  iterate(false, v);
}
如何在运行时更改迭代器方向,而无需复制for循环?
想象一下,循环是一个相当复杂的算法,您不想复制该算法以避免将来的维护问题。请注意,我需要访问循环主体中的std::next / std::previous元素。

最佳答案

有了一点间接性,即使用帮助器函数,您可以调用一个模板函数,该函数接受要循环播放的迭代器类型,例如

template<typename Iterator>
void iterate_helper(Iterator start, Iterator end)
{
    for (auto it = start; it != end; ++it) 
    {
        std::cout << *it << " -> " << *std::next(it) << std::endl;
    }
    std::cout << std::endl;
}

void iterate(bool forward, std::vector<int> v)
{
        if (!forward)
            iterate_helper(v.rbegin(), v.rend());
        else
            iterate_helper(v.begin(), v.end());
}

以防万一此示例代码是真实代码,请注意,for循环中的*std::next(it)将超出容器末尾。您的结束条件需要在end之前停止使用它。

关于c++ - 如何在运行时选择迭代器方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63340778/

相关文章:

java - ConcurrentModificationException,我想删除 HashMap 值中的相同名称

python - 列表字典的笛卡尔积 - 带排序

c++ - 我们可以安全地依赖迭代器 v.end() 的位置吗?

c++ - 如何优化写入大量文件的时间(从视频中保存帧)

c++ - 随机访问优先级队列

c++ - Windows 中的缩略图是什么?

c++ - SHGetPathFromIDList() (和类似的)是否在其参数中放置一个终止 0?

c++ - 将模板 lambda 转换为 `void *` 是否安全?

python - 如何在for循环python中使用计数器

java - 如何使用迭代器以编程方式绘制 N 个元素的 block