c++ - 如何使用迭代器实现从序列中间到开头的循环?
问题描述
我想从中间到开头迭代一个集合,但我不确定实现它的最佳方法。另一件复杂的事情是我有一个函数,我必须传递一个迭代器。解释我的问题的代码:
第一种方法:
template <typename RandomIt>
void Example(RandomIt first, RandomIt last)
{
auto size = std::distance(first, last);
RandomIt middle = std::next(first, size / 2 - 1);
for (auto i = middle; ; --i)
{
OtherFunction(i);
if (i == first) break;
}
}
第二种方法:
template <typename RandomIt>
void Example(RandomIt first, RandomIt last)
{
auto size = std::distance(first, last);
RandomIt middle = std::next(first, size / 2 - 1);
auto rmiddle = std::make_reverse_iterator(std::next(middle, 1));
auto rlast = std::make_reverse_iterator(first);
for (auto i = rmiddle; i != rlast; ++i)
OtherFunction(i.base()- 1);
}
每一个都不是很直观。第一个有无限循环,第二个有很长的 rmiddle 定义,我必须将迭代器作为 i.base()-1 传递,不太容易阅读。我需要类似 do-while 的东西,但首先检查条件,然后即使条件为假也执行代码,然后结束循环。有没有更好的方法或模式来处理这样的事情?
解决方案
您的第一种方法存在问题,因为您不遵循通常的模式 - 使用 [first,last[ 作为范围,您尝试使用 [first,last] (包括最后一个):
template <typename RandomIt>
void Example(RandomIt first, RandomIt last)
{
auto size = std::distance(first, last);
RandomIt middle = std::next(first, size / 2);
for (auto i = middle; i != first;)
{
OtherFunction(--i);
}
}
推荐阅读
- java - Java - 比较 Sentinel 值的字符串的问题
- python-3.x - Selenium 的 Send_Keys 未捕获 pyqt5 的 QLabel 文本
- apache-kafka - spring cloud kafka流的连接错误
- c++ - 运行时错误:向量下标超出范围:检查空集
- ios - swift仅在将手机用作模拟器时失败,退出代码为1
- sql - 在 SQL Server 中使用 XML OPTIONS 生成 XML 输出
- python - 剥离和格式化坐标对
- haskell - show 和 print_data 函数的区别
- javascript - Socket.io - 无法向房间发送消息
- spring-mvc - 未使用路径变量和 http 请求作为参数调用 Spring Rest Controller 方法