是否有更好的方法以相反的顺序打印矢量:
#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());
}
答案 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::reverse和ranges 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