我想从中间到开始遍历一个集合,但是我不确定实现它的最佳方法。使它变得复杂的另一件事是,我有一个必须传递迭代器的函数。代码解释我的问题:
第一种方法:
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也要执行代码,然后结束循环。有没有更好的方法或模式来处理这样的事情?
答案 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);