Gibt es in C ++ eine integrierte Vektorfunktion, um einen vorhandenen Vektor umzukehren?
Oder müssen Sie es nur manuell tun?
Gibt es in C ++ eine integrierte Vektorfunktion, um einen vorhandenen Vektor umzukehren?
Oder müssen Sie es nur manuell tun?
Antworten:
Zu diesem Zweck enthält std::reverse
der algorithm
Header eine Funktion .
#include <vector>
#include <algorithm>
int main() {
std::vector<int> a;
std::reverse(a.begin(), a.end());
return 0;
}
Alle Container bieten eine umgekehrte Ansicht ihres Inhalts mit rbegin()
und rend()
. Diese beiden Funktionen geben sogenannte Reverse-Iteratoren zurück , die wie normale verwendet werden können, aber es sieht so aus, als ob der Container tatsächlich umgekehrt ist.
#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-Beispiel auf Ideone . Ausgabe:
1->2->3->4->5
=============
5<-4<-3<-2<-1
std::sort
einen 1000-Elemente-Vektor verwenden, wenn Sie nur die Top-10 in nicht spezifizierter Reihenfolge benötigen, weil sie eleganter ist als std::partition
? Dies ist die Denkschule, die meine PC-Erfahrung heute wie vor 15 Jahren lähmt, mit dem Unterschied, dass noch mehr Zyklen verschwendet werden, Milliarden davon.
print_range
ist nicht korrekt: Es funktioniert nicht, wenn der leere Bereich überschritten wird.
std::reverse(a.rbegin(), a.rend())
tun? ; ^)
Sie können verwendet werden, std::reverse
wie dies
std::reverse(str.begin(), str.end());
Sie können auch std::list
anstelle von verwenden std::vector
. list
hat eine eingebaute Funktionsliste :: reverse zum Umkehren von Elementen.
Oft möchten Sie den Vektor umkehren, weil Sie ihn füllen, indem Sie alle Elemente am Ende weiterschieben, sie aber tatsächlich in umgekehrter Reihenfolge erhalten haben. In diesem Fall können Sie den Container im Laufe der Zeit umkehren, indem Sie stattdessen a deque
verwenden und ihn direkt auf die Vorderseite schieben. (Oder Sie könnten vector::insert()
stattdessen die Elemente an der Vorderseite mit einfügen , aber das wäre langsam, wenn es viele Elemente gibt, da alle anderen Elemente bei jeder Einfügung gemischt werden müssen.) Im Gegensatz zu:
std::vector<int> foo;
int nextItem;
while (getNext(nextItem)) {
foo.push_back(nextItem);
}
std::reverse(foo.begin(), foo.end());
Sie können stattdessen Folgendes tun:
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
}