Esiste una funzione vettoriale integrata in C ++ per invertire un vettore in atto?
O devi semplicemente farlo manualmente?
Esiste una funzione vettoriale integrata in C ++ per invertire un vettore in atto?
O devi semplicemente farlo manualmente?
Risposte:
C'è una funzione std::reverse
in algorithm
intestazione per questo scopo.
#include <vector>
#include <algorithm>
int main() {
std::vector<int> a;
std::reverse(a.begin(), a.end());
return 0;
}
Tutti i contenitori offrono una vista invertita del loro contenuto con rbegin()
e rend()
. Queste due funzioni restituiscono i cosiddetti iteratori inversi , che possono essere utilizzati come quelli normali, ma sembrerà che il contenitore sia 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(), "<-");
}
Esempio live su Ideone . Produzione:
1->2->3->4->5
=============
5<-4<-3<-2<-1
std::sort
un vettore di 1000 elementi, se solo avessi bisogno della top-10 in un ordine non specificato, perché è più elegante di std::partition
? Questa è la scuola di pensiero che paralizza la mia esperienza su PC oggi come 15 anni fa, con la differenza che vengono sprecati ancora più cicli, miliardi di loro.
print_range
non è corretto: non funzionerà quando viene superato l'intervallo vuoto .
std::reverse(a.rbegin(), a.rend())
? ; ^)
Puoi usare std::reverse
così
std::reverse(str.begin(), str.end());
Puoi anche usare al std::list
posto di std::vector
. list
ha un elenco di funzioni integrato :: reverse per invertire gli elementi.
Spesso il motivo per cui si desidera invertire il vettore è perché lo si riempie spingendo tutti gli elementi alla fine, ma in realtà li si ricevevano in ordine inverso. In tal caso è possibile invertire il contenitore mentre si procede utilizzando un deque
invece e spingendolo direttamente sulla parte anteriore. (Oppure potresti inserire gli elementi nella parte anteriore con vector::insert()
, ma sarebbe lento quando ci sono molti articoli perché deve mescolare tutti gli altri elementi per ogni inserimento.) Invece di:
std::vector<int> foo;
int nextItem;
while (getNext(nextItem)) {
foo.push_back(nextItem);
}
std::reverse(foo.begin(), foo.end());
Puoi invece fare:
std::deque<int> foo;
int nextItem;
while (getNext(nextItem)) {
foo.push_front(nextItem);
}
// No reverse needed - already in correct order
#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
}