Esiste una funzione vettoriale incorporata in C++ per invertire un vettore?Come si inverte un vettore C++?
Oppure devi farlo manualmente?
Esiste una funzione vettoriale incorporata in C++ per invertire un vettore?Come si inverte un vettore C++?
Oppure devi farlo manualmente?
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;
}
È possibile utilizzare std::reverse
come questo
std::reverse(str.begin(), str.end());
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
che tuttavia non inverte il vettore sul posto. È possibile creare un nuovo vettore con std :: vector
@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
@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. –
È anche possibile utilizzare al posto di std::list
std::vector
. list
ha una funzione integrata list::reverse per gli elementi di inversione.
Ho appena aggiunto lo spazio dei nomi 'std', spero non ti dispiaccia;) ... – MartinStettner
No, grazie. Ho appena notato le tue modifiche e sono assolutamente adeguate e accurate. –
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! –