如何使用迭代器从序列的中间到开头实现循环?

时间:2019-03-05 21:50:01

标签: c++ loops iterator

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

第一种方法:

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

每个都不是很直观。第一个具有无限循环并带有中断,第二个具有冗长的定义,我必须将迭代器作为i.base()-1传递,这并不是很容易阅读。我需要类似do-while的操作,但首先要检查条件,然后即使条件为false也要执行代码,然后结束循环。有没有更好的方法或模式来处理这样的事情?

2 个答案:

答案 0 :(得分:1)

您的第一种方法有一个问题,因为您没有遵循通常的模式-将[first,last [作为范围,请尝试使用[first,last](包括了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);
    }
}

答案 1 :(得分:0)

因为您正在使用

template <typename RandomIt> ...

我假设您有一个RandomAccesssIterator。

RandomAccessIterator支持大于运算符。您可以使用:

// Take care of all items except first in the loop.
for (auto i = middle; i > first; --i)
{
    OtherFunction(i);
}

// Take care of first
OtherFunction(first);