Hoe keer ik een C++-vector om?

Is er een ingebouwde vectorfunctie in C++ om een vector op zijn plaats om te keren?

Of moet je het gewoon handmatig doen?


Antwoord 1, autoriteit 100%

Voor dit doel is er een functie std::reversein de algorithm-header.

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

Antwoord 2, autoriteit 16%

Alle containers bieden een omgekeerde weergavevan hun inhoud met rbegin()en rend(). Deze twee functies retourneren zogenaamde reverse iterators, die als normale iterators kunnen worden gebruikt, maar het zal lijken alsof de container daadwerkelijk is omgekeerd.

#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(), "<-");
}

Live voorbeeld op Ideone. Uitgang:

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

Antwoord 3, autoriteit 9%

Je kunt std::reversezo gebruiken

std::reverse(str.begin(), str.end());

Antwoord 4

Vaak is de reden dat u de vector wilt omkeren, omdat u deze vult door alle items aan het einde op te schuiven, maar ze in feite in omgekeerde volgorde ontving. In dat geval kun je de container gaandeweg omkeren door in plaats daarvan een dequete gebruiken en deze direct op de voorkant te duwen. (Of je zou de items aan de voorkant kunnen invoegen met vector::insert()in plaats daarvan, maar dat zou traag zijn als er veel items zijn, omdat het alle andere items moet schudden voor elke invoeging .) Dus in tegenstelling tot:

std::vector<int> foo;
int nextItem;
while (getNext(nextItem)) {
    foo.push_back(nextItem);
}
std::reverse(foo.begin(), foo.end());

U kunt in plaats daarvan het volgende doen:

std::deque<int> foo;
int nextItem;
while (getNext(nextItem)) {
    foo.push_front(nextItem);
}
// No reverse needed - already in correct order

Antwoord 5

Je kunt ook std::listgebruiken in plaats van std::vector. listheeft een ingebouwde functie list::reversevoor het omkeren van elementen.


Antwoord 6

#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
}

Other episodes