C++ 使用正向迭代器对std::vector进行反向迭代

C++ 使用正向迭代器对std::vector进行反向迭代,c++,C++,如果我有一个函数,它使用一个名为begin的std::vector::const_迭代器和一个名为end的std::vector::const_迭代器,我是否可以反向迭代它 更新 我无法更改函数签名,如下所示: void func(Foo::const_iterator begin, Foo::const_iterator end) { ... } 并致电: func(foo.begin(), foo.end()); 我也不能改变是的,你可以 template <typenam

如果我有一个函数,它使用一个名为begin的
std::vector::const_迭代器
和一个名为end的
std::vector::const_迭代器
,我是否可以反向迭代它

更新

我无法更改函数签名,如下所示:

void func(Foo::const_iterator begin, Foo::const_iterator end) 
{
   ...
}
并致电:

func(foo.begin(), foo.end());
我也不能改变

是的,你可以

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());
}
模板
无效测试(类型名Foo::const_迭代器begin,
typename Foo::const_迭代器(结束)
{
反迭代器
吕贝金(完),
撕裂(开始);
std::copy(rbegin,rend,std::ostream_迭代器(std::cout));
}
int main()
{
std::向量v{3,1,4,1,5,9,2,6};
测试(v.开始(),v.结束());
}
是的,你可以

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());
}
模板
无效测试(类型名Foo::const_迭代器begin,
typename Foo::const_迭代器(结束)
{
反迭代器
吕贝金(完),
撕裂(开始);
std::copy(rbegin,rend,std::ostream_迭代器(std::cout));
}
int main()
{
std::向量v{3,1,4,1,5,9,2,6};
测试(v.开始(),v.结束());
}

我可能误解了这个问题,但您是否只需要:

while (begin != end) {
    --end;
    // do something with *end
}
如果你需要一个向后的迭代器,ipc的答案会给你一个

在使用
vector
的实践中,您可能会在(begin!=end--)时侥幸逃脱
,但不要受到诱惑。如果迭代器位于向量的开头(即等于
vector::begin()
的结果),则递减迭代器是未定义的行为

此代码至少需要一个双向运算符。幸运的是,
vector
有一个RandomAccessIterator,它甚至更好

如果您真正只有一个ForwardIterator,那么您必须在该范围内进行迭代,并将迭代器值存储在某个位置(如
堆栈
),然后按相反顺序使用它们:

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();
}
std::堆栈迭代器;
while(开始!=结束){
迭代器。推送(开始);
++开始;
}
而(!iterators.empty()){
Foo::const_iterator i=iterators.top();
//和我一起做点什么
iterators.pop();
}

此代码至少需要一个ForwardIterator(它不能仅与InputIterator一起工作)。

我可能误解了这个问题,但您是否只需要:

while (begin != end) {
    --end;
    // do something with *end
}
如果你需要一个向后的迭代器,ipc的答案会给你一个

在使用
vector
的实践中,您可能会在(begin!=end--)时侥幸逃脱
,但不要受到诱惑。如果迭代器位于向量的开头(即等于
vector::begin()
的结果),则递减迭代器是未定义的行为

此代码至少需要一个双向运算符。幸运的是,
vector
有一个RandomAccessIterator,它甚至更好

如果您真正只有一个ForwardIterator,那么您必须在该范围内进行迭代,并将迭代器值存储在某个位置(如
堆栈
),然后按相反顺序使用它们:

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();
}
std::堆栈迭代器;
while(开始!=结束){
迭代器。推送(开始);
++开始;
}
而(!iterators.empty()){
Foo::const_iterator i=iterators.top();
//和我一起做点什么
iterators.pop();
}

此代码至少需要一个ForwardIterator(它不能仅与InputIterator一起工作)。

是的,您可以使用
std::reverse\u迭代器。这也是一个好主意
显式指定迭代器的类型。使用模板
而不是争论

#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;
}
#包括
#包括
#包括
#包括
样板
void x(双向运算符b、双向运算符e){
反迭代器rb(e),re(b);
标准::每个(rb、re、,
[](typename双向运算符::引用x)

{std::cout是的,您可以使用
std::reverse\u迭代器
。最好不要使用 要显式指定迭代器的类型,请使用模板 而不是争论

#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;
}
#包括
#包括
#包括
#包括
样板
void x(双向运算符b、双向运算符e){
反迭代器rb(e),re(b);
标准::每个(rb、re、,
[](typename双向运算符::引用x)

{std::cout
vector::const_迭代器
是一个随机访问迭代器,而不是前向迭代器。
vector::const_迭代器
是一个随机访问迭代器,而不是前向迭代器。你可以更简洁地命名反向迭代器类型,在本例中是
std::vector::const_reverse_迭代器
@stevesop。但是如果你有一个
Foo
你可能不想依赖它。@ipc:true,如果
Foo
不是可逆容器,那么你就不能依赖它。如果你将迭代器类型而不是元素类型作为模板参数,那么它就不可用。你可以更简洁地命名反向迭代器类型,它是
std::vector::const\u reverse\u iterator
@SteveJessop在这种情况下是正确的。但是如果你有一个
Foo
你可能不想依赖它。@ipc:true,如果
Foo
不是ReversibleContainer,那么你就不能依赖它。如果你把迭代器类型而不是元素类型作为模板参数,那么它就不可用。