【问题标题】:Iterating a vector in reverse order with a range-for loop? [duplicate]使用 range-for 循环以相反的顺序迭代向量? [复制]
【发布时间】:2020-07-25 16:56:13
【问题描述】:

我想以相反的顺序迭代一个向量,我知道我可以通过下面的代码轻松地做到这一点

#include<bits/stdc++.h>
using namespace std;
int main()
{
    vector<int> v(10);
    for(auto it=v.rbegin();it!=v.rend();it++)
        cout<<*it<<"";
}

为了向前迭代,我们可以简单地通过下面的代码来完成。

for(auto it:v)
  cout<<it<<" ";

现在任务是……

是否可以进行类似于for(auto it:v) cout&lt;&lt;it&lt;&lt;" " 的反向迭代。如果是,那么如何?

【问题讨论】:

    标签: c++ stl stdvector


    【解决方案1】:

    如果可以使用 C++20,则可以使用范围库,因此可以使用 std::ranges::reverse_view:

    vector<int> v(10);
    std::ranges::reverse_view vReversed{v};
    
    for(auto it : vReversed)
        cout<<it<<" ";
    

    【讨论】:

    • 打败我 :-)
    【解决方案2】:

    或者你可以自己写一个。类似的东西

    template<class Source>
    struct Reverse {
         Reverse(Source &&s): s(std::forward<Source>(s)) {}
         constexpr decltype(auto) begin() const { return std::rbegin(s); }
         constexpr decltype(auto end() const { return std::rend(s); }
    private:
         S &&s;
    };
    

    【讨论】:

    • 您知道s 不是转发引用吗?您不能使用左值向量 (live demo) 构造 Reverese。此外,您的代码中存在拼写错误。请先尝试编译并使用它,然后再发布到这里。
    • @DanielLangr ... 或者干脆承认“类似”不是“生产就绪”的同义词。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2018-05-31
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多