提问人:Dollarslice 提问时间:1/16/2012 最后编辑:Sneaky Polar BearDollarslice 更新时间:3/18/2023 访问量:245785
如何反转 C++ 向量?
How do I reverse a C++ vector?
答:
359赞
Ivaylo Strandjev
1/16/2012
#1
标头中有一个函数用于此目的。std::reverse
algorithm
#include <vector>
#include <algorithm>
int main() {
std::vector<int> a;
std::reverse(a.begin(), a.end());
return 0;
}
评论
1赞
Coder
1/15/2016
你能解释一下如何反转向量的向量吗?我希望将 v[0] 与 v[v.size()-1] 交换,并且 v[0][i] 元素的顺序保持不变。这类似于改变行的顺序(如果将向量视为矩阵)。如果向量定义为:vector<vector<int> > v;reverse(v.begin(), v.end()) 不会反转它。TIA!
0赞
Ivaylo Strandjev
1/15/2016
@VikasGoel事实上,您建议的片段应该有效。也许还有其他问题?
0赞
mo FEAR
5/19/2022
你也可以保持元素的相反顺序,但然后向后迭代: for(auto i=a.end(); i!=a.begin();i--) {...} 尽管由于偏离一个错误,这可能很棘手。因此,像其他人建议的那样使用 rbegin() 和 rend() 会更好
28赞
Chuck Norris
1/16/2012
#2
你可以这样使用std::reverse
std::reverse(str.begin(), str.end());
54赞
Xeo
1/16/2012
#3
所有容器都提供其内容的反向视图,其中包含 和 。这两个函数返回所谓的反向迭代器,可以像普通迭代器一样使用,但看起来容器实际上是反转的。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
评论
1赞
CashCow
1/16/2012
然而,这并不能反转向量。你可以用 std::vector<T> v2( v1.rbegin(), v1.rend() );v2.swap(v1);这将有效地使用您的解决方案。不过,我看不出它在任何方面都比使用 std::reverse 更优雅或更有利。
20赞
Xeo
1/16/2012
@CashCow:嗯,首先,这是一个 no-op,它是 O(1)。换向。。没有那么多。大多数时候,您实际上并不需要反转的容器,您只需要将其视为反转。事实上,我想不出你实际上需要一个无法用反向迭代器解决的反向容器的情况。
5赞
Sebastian Mach
1/17/2012
@CashCow:优雅并不总是真正的优雅。在我职业生涯中的大多数情况下,我只需要一个反转的视图,而不是一个反转的向量。在所有这些情况下,如果您要创建更多副本或改变排序方式,性能将完全受到影响。如果你只需要未指定顺序的前 10 个,你也会是一个 1000 元素向量吗,因为它比 ?这种思想流派使我今天的 PC 体验变得瘫痪,就像 15 年前一样,不同的是浪费了更多的周期,数十亿个周期。std::sort
std::partition
0赞
Nawaz
12/5/2013
print_range
不正确:当传递空范围时,它将不起作用。
0赞
Orwellophile
5/27/2019
所以最大的问题是,会怎么做?;^)std::reverse(a.rbegin(), a.rend())
0赞
Hello W
8/10/2016
#4
您也可以使用 代替 . 具有用于反转元素的内置函数 List::Reverse。std::list
std::vector
list
评论
6赞
eozd
5/15/2018
std::list 应该优先于 vector 在将许多元素插入序列中的任意位置的唯一特定情况下。仅仅因为您将反转序列而使用 std::list 而不是向量,这在性能方面是一个坏主意。
3赞
Arthur Tacca
6/17/2020
#5
通常,您想要反转向量的原因是通过在最后推送所有项目来填充它,但实际上以相反的顺序接收它们。在这种情况下,您可以反转容器,方法是使用 代替并将它们直接推到前面。(或者你可以用 代替在前面插入项目,但当有很多项目时,这会很慢,因为它必须在每次插入时洗牌所有其他项目。因此,与: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
评论
0赞
mo FEAR
5/19/2022
缺点是元素不再像向量那样在内存中连续,因此您不能使用 .data()
评论