2012-01-16 15 views

risposta

193

C'è una funzione std::reverse nell'intestazione algorithm per questo scopo.

#include <vector> 
#include <algorithm> 

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

Ho appena aggiunto lo spazio dei nomi 'std', spero non ti dispiaccia;) ... – MartinStettner

+5

No, grazie. Ho appena notato le tue modifiche e sono assolutamente adeguate e accurate. –

+0

Puoi spiegare come invertire il vettore di vettori? Voglio che v [0] sia scambiato con v [v.size() - 1] e l'ordine di v [0] [i] elemento rimanga come è. Questo è simile al cambiamento dell'ordine delle righe (se un vettore è visto come una Matrice). Se un vettore è definito come: vector > v; reverse (v.begin(), v.end()) non lo inverte. TIA! –

16

È possibile utilizzare std::reverse come questo

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

Tutti i contenitori offrono una rovesciata vista del loro contenuto con rbegin() e rend(). Queste due funzioni restituiscono così chiamate iteratori inversi, che possono essere utilizzate come normali, ma sembreranno come se il contenitore fosse effettivamente invertito.

#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 example on Ideone. Uscita:

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

che tuttavia non inverte il vettore sul posto. È possibile creare un nuovo vettore con std :: vector v2 (v1.rbegin(), v1.rend()); v2.swap (v1); che userebbe efficacemente la tua soluzione. Non vedo come sia più elegante o vantaggioso usare comunque std :: reverse. – CashCow

+11

@CashCow: Beh, per uno, è un no-op, è O (1). Inversione .. non così tanto. Il più delle volte, non hai davvero bisogno di un contenitore invertito, devi solo * vedere * come invertito. In effetti, non posso pensare a una situazione in cui hai effettivamente bisogno di un contenitore invertito che non possa essere risolto con iteratori inversi. – Xeo

+3

@CashCow: l'eleganza non è sempre la vera eleganza. Nella maggior parte dei casi nella mia carriera professionale, avevo solo bisogno di una visione invertita, ma non di un vettore invertito. E in tutti questi casi, le prestazioni sarebbero totalmente inutili se si creassero più copie o si trasformasse l'ordine. Vorresti anche 'std :: sort' un vettore di 1000 elementi, se hai solo bisogno della top 10 in ordine non specificato, perché è più elegante di' std :: partition'? Questa è la scuola di pensiero che paralizza la mia esperienza di PC oggi come 15 anni fa, con la differenza che ancora più cicli sono sprecati, miliardi di loro. –

1

È anche possibile utilizzare al posto di std::liststd::vector. list ha una funzione integrata list::reverse per gli elementi di inversione.

Problemi correlati