C ++ベクターを反転するにはどうすればよいですか?


144

C ++には、ベクターを元に戻す組み込みのベクター関数がありますか?

それとも手動で行う必要がありますか?

回答:


251

この目的のためstd::reverseに、algorithmヘッダーに関数があります。

#include <vector>
#include <algorithm>

int main() {
  std::vector<int> a;
  std::reverse(a.begin(), a.end());
  return 0;
}

ベクトルのベクトルを逆にする方法を説明できますか?v [0]をv [v.size()-1]と入れ替えて、v [0] [i]要素の順序をそのままにしたい。これは、行の順序の変更に似ています(ベクトルが行列として表示される場合)。ベクトルが次のように定義されている場合:vector <vector <int>> v; reverse(v.begin()、v.end())はそれを逆にしません。TIA!
Vikas Goel

@VikasGoel実際には、提案するスニペットが機能するはずです。多分他の問題がありますか?
Ivaylo Strandjev 2016年

45

すべてのコンテナは、およびを使用して、コンテンツを逆に表示します。これらの2つの関数は、通常のリバースイテレーターのように使用できるso-callesのリバースイテレーターを返しますが、実際にはコンテナーがリバースされているように見えます。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(), "<-");
}

イデオネでの実例。出力:

1->2->3->4->5
=============
5<-4<-3<-2<-1

1
ただし、ベクトルがインプレースで反転するわけではありません。std :: vector <T> v2(v1.rbegin()、v1.rend());で新しいベクトルを作成できます。v2.swap(v1); ソリューションを効果的に使用します。しかし、どのようにstd :: reverseを使用するよりもエレガントで有利であるかはわかりません。
CashCow 2012年

17
@CashCow:まあ、一つには、それは何もしない、それはO(1)です。逆転..それほどではありません。時間のほとんどは、あなたが本当にあなただけのために必要な、逆の容器を必要としない参照逆転としてそれを。実際、リバースイテレーターでは解決できないリバースコンテナーが実際に必要な状況は考えられません。
Xeo

4
@CashCow:エレガンスは必ずしも真のエレガンスとは限りません。私のプロのキャリアのほとんどの場合、私は逆の見方が必要でしたが、逆のベクトルは必要ありませんでした。そして、これらすべてのケースで、コピーをさらに作成したり、順序を変更したりすると、パフォーマンスがまったく不要になります。それstd::sortよりもエレガントであるため、不特定の順序でトップ10だけが必要な場合は、1000要素のベクトルも使用しstd::partitionますか?これは、15年前と同じように、今日の私のPCエクスペリエンスを損なうという考え方の集まりです。ただし、さらに多くのサイクルが浪費されるという違いがあります。
セバスチャンマッハ

print_range不正解です。空の範囲が渡されると機能しません。
Nawaz

大きな問題は、何をstd::reverse(a.rbegin(), a.rend())するかということです。; ^)
Orwellophile


2

std::list代わりに使用することもできますstd::vector。要素を逆にするためのlist組み込み関数list :: reverseがあります。


3
std :: listは、シーケンスの任意の位置に多くの要素を挿入する特定の場合にのみ、ベクターよりも優先する必要があります。シーケンスを逆にするだけの理由でベクター上でstd :: listを使用することは、パフォーマンスの面で悪い考えです。
eozd、

0

多くの場合、ベクターを逆にする必要があるのは、最後にすべてのアイテムを押してベクターを埋めたが、実際には逆の順序でそれらを受け取っていたためです。その場合は、deque代わりにaを使用して直接前面に押すことで、コンテナーを逆にすることができます。(または、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
#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
}

1
この8歳の質問には、何も追加しない別の重複回答が必要ですか?
高炉
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.