以相反的顺序打印矢量

时间:2013-08-26 14:49:21

标签: c++ vector stl

是否有更好的方法以相反的顺序打印矢量:

#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());
}

5 个答案:

答案 0 :(得分:17)

您可以使用反向迭代器:

for_each(vec.rbegin(),vec.rend(),print_elem);

答案 1 :(得分: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"));

答案 2 :(得分:3)

使用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

答案 3 :(得分:0)

有许多方法可以做到这一点。我将只解释一种,在this链接中可以看到更多的信息。

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

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

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

以下是一个简单的实现:

for(auto x = vec.crbegin() ; x!=vec.crend() ; x++){
        cout<<*x<<" ";
}

答案 4 :(得分:0)

在C ++ 20中,您可以利用gcc 10在views::reverseranges library中找到的supported

#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