Answers:
有一个功能,std::reverse
在algorithm
用于此目的的头。
#include <vector>
#include <algorithm>
int main() {
std::vector<int> a;
std::reverse(a.begin(), a.end());
return 0;
}
所有容器提供了一个相反的观点其内容与rbegin()
和rend()
。这两个函数返回所谓的反向迭代器,可以像普通迭代器一样使用,但是看起来容器实际上是反向的。
#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(), "<-");
}
有关Ideone的现场示例。输出:
1->2->3->4->5
=============
5<-4<-3<-2<-1
std::sort
如果只需要前10位以不确定的顺序排序,是否还会有一个1000元素的向量,因为它比优雅std::partition
?这是一门思想流派,使我今天的PC体验像15年前一样受到损害,不同之处是浪费了更多的周期,其中数十亿周期被浪费掉了。
print_range
是不正确的:当传递空范围时,它将不起作用。
std::reverse(a.rbegin(), a.rend())
办?; ^)
您也可以使用std::list
代替std::vector
。list
有一个内置的功能list :: reverse用于反转元素。
通常,您想反转向量的原因是因为您通过将所有项目推到最后来填充它,但实际上却以相反的顺序接收它们。在这种情况下,您可以通过使用a容器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
#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
}