Existe-t-il une fonction vectorielle intégrée en C ++ pour inverser un vecteur en place?
Ou devez-vous simplement le faire manuellement?
Existe-t-il une fonction vectorielle intégrée en C ++ pour inverser un vecteur en place?
Ou devez-vous simplement le faire manuellement?
Réponses:
Il y a une fonction std::reverse
dans l'en- algorithm
tête à cet effet.
#include <vector>
#include <algorithm>
int main() {
std::vector<int> a;
std::reverse(a.begin(), a.end());
return 0;
}
Tous les conteneurs offrent une vue inversée de leur contenu avec rbegin()
et rend()
. Ces deux fonctions renvoient des itérateurs inversés , qui peuvent être utilisés comme des fonctions normales, mais il semblera que le conteneur est en fait inversé.
#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(), "<-");
}
Exemple en direct sur Ideone . Production:
1->2->3->4->5
=============
5<-4<-3<-2<-1
std::sort
un vecteur de 1000 éléments, si vous avez juste besoin du top-10 dans un ordre non spécifié, car il est plus élégant que std::partition
? C'est l'école de pensée qui paralyse mon expérience informatique aujourd'hui comme elle le faisait il y a 15 ans, à la différence que davantage de cycles sont gaspillés, des milliards d'entre eux.
print_range
n'est pas correct: cela ne fonctionnera pas lorsque la plage vide est passée.
std::reverse(a.rbegin(), a.rend())
faire? ; ^)
Vous pouvez utiliser std::reverse
comme ça
std::reverse(str.begin(), str.end());
Vous pouvez également utiliser à la std::list
place de std::vector
. list
a une fonction intégrée list :: reverse pour inverser les éléments.
Souvent, la raison pour laquelle vous souhaitez inverser le vecteur est que vous le remplissez en appuyant sur tous les éléments à la fin, mais que vous les receviez dans l'ordre inverse. Dans ce cas, vous pouvez inverser le conteneur au fur et à mesure en utilisant un à la deque
place et en le poussant directement sur le devant. (Ou vous pouvez insérer les éléments à l'avant avec à la vector::insert()
place, mais ce serait lent quand il y a beaucoup d'éléments car il doit mélanger tous les autres éléments le long de chaque insertion.) Donc, par opposition à:
std::vector<int> foo;
int nextItem;
while (getNext(nextItem)) {
foo.push_back(nextItem);
}
std::reverse(foo.begin(), foo.end());
Vous pouvez à la place faire:
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
}