首页 > 解决方案 > 如何使用迭代器实现从序列中间到开头的循环?

问题描述

我想从中间到开头迭代一个集合,但我不确定实现它的最佳方法。另一件复杂的事情是我有一个函数,我必须传递一个迭代器。解释我的问题的代码:

第一种方法:

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 的东西,但首先检查条件,然后即使条件为假也执行代码,然后结束循环。有没有更好的方法或模式来处理这样的事情?

标签: c++loopsiterator

解决方案


您的第一种方法存在问题,因为您不遵循通常的模式 - 使用 [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);
    }
}

推荐阅读