首页 > 解决方案 > 如何在运行时选择迭代器方向

问题描述

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

#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 元素。

标签: c++iterator

解决方案


通过一点间接,即使用辅助函数,您可以调用模板函数,该函数接受您想要循环的迭代器类型,例如

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());
}

万一这个示例代码是真实的代码,请注意*std::next(it)在 for 循环中将超过容器的末尾。您的结束条件需要先停止一个才能end使用它。


推荐阅读