【发布时间】:2012-02-11 05:49:53
【问题描述】:
C++ 中是否有内置的向量函数来反转向量?
还是只需要手动操作?
【问题讨论】:
C++ 中是否有内置的向量函数来反转向量?
还是只需要手动操作?
【问题讨论】:
为此目的,algorithm 标头中有一个函数 std::reverse。
#include <vector>
#include <algorithm>
int main() {
std::vector<int> a;
std::reverse(a.begin(), a.end());
return 0;
}
【讨论】:
所有容器都通过rbegin() 和rend() 提供其内容的反向视图。这两个函数返回所谓的reverse iterators,可以像普通的一样使用,但看起来容器实际上是反转的。
#include <vector>
#include <iostream>
template<class InIt>
void print_range(InIt first, InIt last, char const* delim = "\n"){
--last;
for(; first != last; ++first){
std::cout << *first << delim;
}
std::cout << *first;
}
int main(){
int a[] = { 1, 2, 3, 4, 5 };
std::vector<int> v(a, a+5);
print_range(v.begin(), v.end(), "->");
std::cout << "\n=============\n";
print_range(v.rbegin(), v.rend(), "<-");
}
1->2->3->4->5
=============
5<-4<-3<-2<-1
【讨论】:
std::sort 一个 1000 元素向量,因为它比 std::partition 更优雅?就像 15 年前一样,这就是今天的思想流派,它削弱了我今天的 PC 体验,不同之处在于浪费了更多周期,数十亿周期。
print_range 不正确:超过 empty 范围时将不起作用。
std::reverse(a.rbegin(), a.rend()) 会做什么? ;^)
你可以像这样使用std::reverse
std::reverse(str.begin(), str.end());
【讨论】:
您想要反转向量的原因通常是因为您通过在最后推动所有项目来填充它,但实际上是以相反的顺序接收它们。在这种情况下,您可以使用deque 来反转容器,并将它们直接推到前面。 (或者您可以使用vector::insert() 在前面插入项目,但是当有很多项目时,这会很慢,因为每次插入都必须将所有其他项目随机排列。)所以相对于:
std::vector<int> foo;
int nextItem;
while (getNext(nextItem)) {
foo.push_back(nextItem);
}
std::reverse(foo.begin(), foo.end());
你可以这样做:
std::deque<int> foo;
int nextItem;
while (getNext(nextItem)) {
foo.push_front(nextItem);
}
// No reverse needed - already in correct order
【讨论】:
您也可以使用std::list 代替std::vector。 list 有一个内置函数 list::reverse 用于反转元素。
【讨论】:
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int>v1;
for(int i=0; i<5; i++)
v1.push_back(i*2);
for(int i=0; i<v1.size(); i++)
cout<<v1[i]; //02468
reverse(v1.begin(),v1.end());
for(int i=0; i<v1.size(); i++)
cout<<v1[i]; //86420
}
【讨论】: