C++11 在C++;,如何使用for_反向迭代数组?

C++11 在C++;,如何使用for_反向迭代数组?,c++11,stl,stdarray,C++11,Stl,Stdarray,在C++11中,使用lambda/for_,我们如何从末尾迭代数组 我尝试了以下方法,但都会导致无限循环: for_each (end(A), begin(A), [](int i) { .... }); for_each (A.rend(), A.rbegin(), [](int i) { ... }); 有什么想法吗?谢谢 你错过了这个 翻转你的rbegin&rend for_each (A.rbegin(), A.rend(), [](int i) { ... }

在C++11中,使用lambda/for_,我们如何从末尾迭代数组

我尝试了以下方法,但都会导致无限循环:

for_each (end(A), begin(A), [](int i) {
   ....
});

for_each (A.rend(), A.rbegin(), [](int i) {
    ...
});
有什么想法吗?谢谢

你错过了这个

翻转你的
rbegin
&
rend

for_each (A.rbegin(), A.rend(), [](int i) {
    ...
});
增加反向迭代器将它们移到容器的开头(A.rbegin(),A.rend(),[](int i){/*code*/})是一个简单的解决方案

相反,我使用免费的
begin
end
函数(使用
std::begin
std::end
使用附近的声明--full ADL)向后编写
begin
序列,从中提取
begin
end
迭代器,在它们周围创建反向迭代器,然后返回包含这两个反向迭代器的序列

它有点简洁,因为您可以使用以下语法:

for( int i : backwards(A) ) {
  // code
}
我发现它比
std::for_each
循环的手动
更容易阅读

但我有点疯了

这里有一个最小的
向后的
。完整的解决方案可以更好地处理adl和一些角落案例

template<class It, class C>
struct range_for_t{
  It b,e;
  C c; // for lifetime
  It begin()const{return b;}
  It end()const{return e;}
}
template<class It, class C>
range_for_t<It,C> range_for(It b,It e,C&& c){
  return {std::move(b),std::move(e),std::forward<C>(c)};
}

template<class It>
range_for_t<It,int> range_for(It b,It e){
  return {std::move(b),std::move(e)};
}
这是未经测试的,但应该有效

一个重要的测试是确保它在向右值向量馈送时工作,如:

 for(auto x:backwards(make_vec()))

工作——这就是存储
C
的混乱之处。它还假设移动的容器迭代器具有行为良好的迭代器。

Boost提供了一个名为的功能,可与Yakk在其回答中描述的功能一起使用:

for(int i : reverse(A))
{
  // code
}


哎呀,我错了!谢谢!你倒转了伦德和贝金。@Borgleader是的,你是对的。谢谢
for(int i : reverse(A))
{
  // code
}
for(int i : A | reversed)
{
  // code
}