如果我的函数需要std::vector<T>::const_iterator
名为begin而std::vector<T>::const_iterator
名为end,那么我是否可以向后迭代它?
更新
我无法更改功能签名,如下所示:
void func(Foo::const_iterator begin, Foo::const_iterator end)
{
...
}
并致电:
func(foo.begin(), foo.end());
我也无法改变
答案 0 :(得分:5)
是的,你可以。
template <typename Foo>
void test(typename Foo::const_iterator begin,
typename Foo::const_iterator end)
{
std::reverse_iterator<typename Foo::const_iterator>
rbegin(end),
rend(begin);
std::copy(rbegin, rend, std::ostream_iterator<typename std::iterator_traits<typename Foo::const_iterator>::value_type>(std::cout));
}
int main()
{
std::vector<int> v{3,1,4,1,5,9,2,6};
test<std::vector<int> >(v.begin(), v.end());
}
答案 1 :(得分:3)
我可能误解了这个问题,但你只需要:
while (begin != end) {
--end;
// do something with *end
}
如果你需要一个倒退的迭代器,ipc的答案会给你一个。
在使用vector
的练习中,您可能会使用while (begin != end--)
,但不要受到诱惑。如果迭代器位于向量的开头(即等于vector::begin()
的结果),则递减迭代器是未定义的行为。
此代码至少需要一个BidirectionalIterator。幸运的是,vector
有一个RandomAccessIterator,甚至更好。
如果你真的只有一个ForwardIterator,那么你必须迭代范围并将迭代器值存储在某处(比如stack
),然后以相反的顺序使用它们:
std::stack<Foo::const_iterator> iterators;
while (begin != end) {
iterators.push(begin);
++begin;
}
while (!iterators.empty()) {
Foo::const_iterator i = iterators.top();
// do something with *i
iterators.pop();
}
此代码至少需要一个ForwardIterator(它不适用于仅仅是InputIterator)。
答案 2 :(得分:2)
是的,您可以使用std::reverse_iterator
。这不是一个好主意
显式指定迭代器的类型。使用模板
相反的论点。
#include <vector>
#include <algorithm>
#include <iostream>
#include <iterator>
template <typename BidirectionalIterator>
void x(BidirectionalIterator b, BidirectionalIterator e) {
std::reverse_iterator<BidirectionalIterator> rb(e), re(b);
std::for_each(rb, re,
[](typename BidirectionalIterator::reference x)
{ std::cout << x << std::endl;});
}
int main()
{
std::vector<int> v{1,2,3,4};
x(begin(v), end(v));
return 0;
}