C++ Comment inverser l'ordre des éléments dans le vecteur?
C'est mon premier post sur ce site, C++ débutant.
Ma question est plutôt simple.
Écrire une fonction qui inverse l'ordre des éléments dans un vecteur.
Par exemple, 1, 3, 5, 7, 9 devient 9, 7, 5, 3, I. La fonction reverse
devrait produire un nouveau vecteur avec l'inversion de l'ordre, laissant son origine
vecteur inchangé.
Et voici mon code. Quand je le lance il n'y a rien qui vient après le mot "Impression". Je suis assez sûr que j'ai fait un bête et simple erreur quelque part, mais ne pouvaient tout simplement pas le comprendre. Serais reconnaissant de toute aide.Des acclamations.
void reverse_a(const vector<int>&v1, vector<int>&v2)
{
//this function creates vector2 with the reverse sequence of elements from vector 1
for(int i=v1.size()-1;i<=0;--i)
{
v2.push_back(v1[i]);
}
}
void print(const vector<int>&v)
{
cout<<"Printing"<<endl;
for(int i=0;i<v.size();++i)
cout<<v[i]<<",";
cout<<"\n"<<"end of print.\n";
}
int main()
{
vector<int>v1;
vector<int>v2;
int input;
while(cin>>input)
v1.push_back(input);
reverse_a(v1,v2);
print(v2);
keep_window_open("`");
}
- Ce qui se passe lorsque vous entrez votre code dans un débogueur?
- S'il vous plaît poster un MCVE et supprimer pertinence de code. Votre inversion de la fonction de commentaires dans ce qui est suspect. De quoi êtes-vous vraiment en train de faire là? Aussi, les vecteurs ont inverse les itérateurs. Et les constructeurs qui prennent itérateur paires.
- Double Possible de Comment puis-je annuler une C++ vector?
Vous devez vous connecter pour publier un commentaire.
reverse_copy
alorsreverse_copy
serait beaucoup plus verbeux, sans aucun avantage réel. Au contraire: Ma solution est de déplacer optimisé et l'appelant de décider si il veut une copie ou pour déplacer la chaîne en place.Que peu moyen
i <= 0
est le continuation clause et doit être vrai pour la boucle d'itération. Il ne sera jamais vrai à moins que votre vecteur est vide ou de taille, dans ce cas, vous recevrez un message d'erreur lorsque vous essayez d'accéderv1[-1]
.Changer le
<=
à un>=
.Rappelez-vous, je suis également pas un grand fan du passage dans un vecteur (même référence) à être modifiée, car il n'y a pas de garantie à la fonction, il ne sera pas déjà quelque chose en elle. Je pense qu'il est plus judicieux de créer la cible vecteur de nouveaux de la fonction et de passer, quelque chose comme:
Vous remarquerez aussi que j'ai changé à l'aide de
size_t
que le type d'index et fait des ajustements pour s'assurer qu'il ne va pas négatif.C'est tout en supposant, bien sûr, que vous êtes en train d'apprendre relativement simple des concepts de la programmation. Professionnelle de programmeurs C++ serait probablement utiliser un itérateur pour remplir un nouveau vecteur, le long des lignes de:
ou avec le minimaliste (pas d'appel de fonction nécessaires autres que la bibliothèque standard celles):
Une fois que vous avez engagés pour l'apprentissage du C++, vous devez le faire avec brio. Il n'y a rien tout à fait aussi mauvais que d'une demi-convertir de la langue 🙂
v1.size()
est unsize_t
qui n'est pas signé). Un de plus solide à la façon d'écrire de la boucle (si vous ne voulez pas utiliser le reverse itérateurs, bien sûr) estfor (size_t i = v1.size(); i--; )
.std::reverse(vec.begin(), vec.end());
à la place.. :Sstd::reverse
(au lieu de la modification), oustd::vector reversed( original.rbegin(), original.rend() );
(neuf). Mais je soupçonne que le but ici est d'apprendre comment faire ce genre de choses lui-même.Utilisation de l'algorithme de
reverse
. Il faut itérateurs bidirectionnels, de sorte que vous passerbegin()
etend()
:}
Si vous avez besoin d'une copie, puis aller pour:
reverse_copy
Vous confondre
<=
avec>=
.Mais en utilisant
reverse_iterator
rendra la tâche plus simpleRemarque: il est un bon endroit pour utiliser
auto
(en C++11) au lieu de la longue type ici:Et le code peut encore être simplifiée:
Vous pouvez essayer de permuter les valeurs à l'aide de l'itérateur.
Quelque chose comme :