Comment cin pour un vecteur
Je suis en train de demander à l'utilisateur de saisir des chiffres c'est de mettre dans un vecteur,
puis à l'aide d'un appel à la fonction de cout les chiffres, pourquoi n'est-ce pas
de travail? Je suis seulement en mesure de cout le premier numéro.
template <typename T>
void write_vector(const vector<T>& V)
{
cout << "The numbers in the vector are: " << endl;
for(int i=0; i < V.size(); i++)
cout << V[i] << " ";
}
int main()
{
int input;
vector<int> V;
cout << "Enter your numbers to be evaluated: " << endl;
cin >> input;
V.push_back(input);
write_vector(V);
return 0;
}
- Dans mon expérience, les cin ne saisit le premier élément d'une chaîne de caractères, si quoi que ce soit après un espace est coupée. Si vous voulez vraiment utiliser cin, de lecture de chaque variable séparément, ou demandez à l'utilisateur de séparer les valeurs par une virgule et d'analyser cela. Ou vous pouvez utiliser le tableau argv dans la méthode main.
- Avez-vous essayez d'utiliser une variable supplémentaire? Au lieu de l'aide de n pour la taille et le temporaire d'entrée.
- Vous devez expliquer ce qui ne fonctionne pas ici.
- BenjaminLindley je suis d'accord avec vous les gars, mais je pensais que l'OP a passé un certain temps déjà, et peut obtenir la réponse. Bien sûr, votre approche est beaucoup mieux.
Vous devez vous connecter pour publier un commentaire.
Comme il est, vous êtes seulement à la lecture dans un unique entier et de le pousser dans votre vecteur. Puisque vous voulez probablement pour stocker plusieurs entiers, vous avez besoin d'une boucle. E. g., remplacer
avec
Ce que ce n'est continuellement tirer dans les ints de cin pour aussi longtemps qu'il est entrée à saisir; la boucle continue jusqu'à ce que cin trouve des expressions du FOLKLORE ou de tente à l'entrée d'une non-valeur de type entier. L'alternative est d'utiliser une sentinelle de la valeur, bien que ceci ne vous empêche de fait la saisie de cette valeur. Ex:
va lire jusqu'à ce que vous essayez d'entrée 9999 (ou l'un des autres états qui rendent cin non valide), à quel point la boucle va se terminer.
D'autres réponses avez-vous refuser un numéro particulier, ou demander à l'utilisateur de saisir quelque chose de non-numériques afin de mettre fin à l'entrée. Peut-être une meilleure solution est d'utiliser
std::getline()
de lire un ligne de l'entrée, puis utilisezstd::istringstream
de lire tous les nombres de cette ligne dans le vecteur.Aussi, votre
write_vector()
mise en œuvre peut être remplacé par un plus idiomatiques appel à lastd::copy()
algorithme de copier les éléments d'unstd::ostream_iterator
àstd::cout
:Vous pouvez également utiliser
std::copy()
et un couple de pratique des itérateurs pour obtenir les valeurs dans le vecteur sans explicite boucle:Mais c'est sans doute exagéré.
Vous avez besoin d'une boucle pour que. Afin de faire ceci:
Ou d'utiliser ce idiomatiques version:
Vous pouvez également améliorer votre
write_vector
comme:A
,a
,jikhjik
,1.29
. Il doit être non-entier. Pourquoi ne pas expérimenter, et de voir comment il fonctionne?end
est non initialisée; neistream_iterator
par défaut de construire à une erreur de l'état qui est compensé par les autres itérateur quand il est mauvais d'entrée? Semble un peu douteux pour moi.end
n'est pas initialisée, c'est la classe, le constructeur par défaut est appelé à laquelle initialisé il.vous avez 2 options:
Si vous connaissez la taille du vecteur sera (dans votre cas/exemple il semble que vous connaissez):
si vous n'avez pas et vous ne pouvez pas l'obtenir en vous r'flux de programme ensuite:
One-liner de lire un fixe nombre de chiffres dans un vecteur (C++11):
std::copy_n
est mieux dans ce cas.Vous avez besoin d'un deuxième entier.
while (cin >> n && V.size() < i-1)
va le faire. Si vous voulez prendre un de plus au lieu d'un moins,i+1
à la place. N'utilisez pas le++
ou--
opérateurs ici, ceux-ci vont modifier la valeur dei
.while (V.size() < i && cin >> n)
cin est délimité sur l'espace, donc si vous essayez de cin "1 2 3 4 5" dans un seul entier, votre ne va être attribution de 1 pour l'entier, une meilleure option est de les envelopper votre entrée et push_back dans une boucle, et de le faire tester à une sentinelle de la valeur, et que les sentinelles de la valeur, appelez votre fonction d'écriture. comme
Vous pouvez simplement le faire avec l'aide de pour la boucle
->Demander de l'exécution d'un utilisateur (combien d'entrées qu'il veut entrer) et de le traiter même comme des tableaux.
Vous voudrez probablement le lire dans plusieurs numéros, pas un seul.
Pour cela, vous avez besoin d'une boucle
Note, avec cette version, il n'est pas possible d'ajouter le nombre de -1 que c'est la "fin de signal".
Tapez les chiffres aussi longtemps que vous le souhaitez, il sera interrompu lorsque vous tapez -1.
Dans ce cas, votre
while
boucle ressembleraLa premièresize()
deV
sera de 0, tout en int n contient aucune valeur aléatoire parce que vous n'avez pas l'initialiser.V.size() < n
est probablement faux.Idiot m'a manqué le
"Enter the amount of numbers you want to evaluate: "
Si vous entrez un
n
qui est plus petit queV.size()
à l'époque, la boucle va se terminer.n
est initialisé aveccin >> n
.Suffit d'ajouter une variable.
n
🙂V.size() < n
? C'est volontaire.n == 0
vous permettra de garder en attente.V.push_back(n)
.Un moyen simple de prendre une entrée dans le vecteur.
serait plus facile si vous spécifiez la taille du vecteur en prenant une entrée :