c++ - 如何在运行时选择迭代器方向
问题描述
我想选择在运行时迭代容器的方向,如以下示例代码所示:
#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());
}
万一这个示例代码是真实的代码,请注意*std::next(it)
在 for 循环中将超过容器的末尾。您的结束条件需要先停止一个才能end
使用它。
推荐阅读
- marten - 使用 ASP.Net Core 连接到 2 个不同的 MartenDB 数据存储
- python - 默认排除一些测试
- python-2.7 - python 2.7有河豚吗?
- php - 将产品数量拆分到 woocommerce 购物车页面上的新行
- angular - 为什么全局搜索不适用于此 PrimeNG 表?
- c++ - 为什么这个循环是无止境的?
- python - 在 Caffe2 上启用多线程
- r - 对于每个行为不合理的循环 - R
- javascript - Intersection Observer API:如何找到用户正在观察的元素
- node.js - 我如何一起构建反应和节点?