2

Is there a better way of printing a vector in reverse order then this:

#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;

void print_elem(int elem)
{
    cout << elem << endl;    
}

int main()
{
    int ia[4]={1,2,3,4};
    vector<int> vec(ia,ia+4);
    reverse(vec.begin(), vec.end());
    for_each(vec.begin(),vec.end(),print_elem);
    reverse(vec.begin(), vec.end());
}
4

5 回答 5

19

您可以使用反向迭代器:

for_each(vec.rbegin(),vec.rend(),print_elem);
于 2013-08-26T14:50:42.757 回答
16

有很多方法可以在不反转元素的情况下反向打印双向序列,例如:

std::copy(vec.rbegin(), vec.rend(), std::ostream_iterator<int>(std::cout, "\n"));
std::reverse_copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, "\n"));
于 2013-08-26T14:52:49.017 回答
4

使用reverse_iterator代替iterator

int main()
{
    int ia[4]={1, 2, 3, 4};
    vector<int> vec(ia,ia+4);
    for(vector<int>::reverse_iterator it = vec.rbegin; it != vec.rend(); ++it)
    {
        std::cout << *it << std::endl;
    }
}

输出将是:4、3、2、1

于 2013-08-26T15:32:16.893 回答
1

有很多方法可以做到这一点。我只会解释一种,更多可以在这个链接中看到。

使用常量反向迭代器(crbegin):

反向迭代器向后迭代,即增加它们会将它们移向容器的开头。

要检查我们是否已经到达起点,我们可以使用迭代器变量(在我的例子中为 x)与 crend 进行比较(返回向量的起点)。记住这里的一切都是相反的!

以下是一个简单的实现:

for(auto x = vec.crbegin() ; x!=vec.crend() ; x++){
        cout<<*x<<" ";
}
于 2019-01-30T19:54:12.000 回答
0

在 C++20 中,您可以利用范围库中的views::reverse并受gcc 10支持。

#include <iostream>
#include <vector>
#include <ranges>

int main()
{

        std::vector V{0, 1, 2, 3, 4, 5, 6, 7};
        for (auto v : V | std::views::reverse)
        {
                std::cout << v << " ";
        }
        return 0;
}

输出是:

7 6 5 4 3 2 1 0
于 2020-12-04T13:43:12.117 回答