Comment parcourir une liste de nombres en c++
Comment itérer sur une liste de nombres, et de combien de manières différentes sont là pour le faire?
Ce qui me semblait:
#include <cstdlib>
#include <iostream>
#include <list>
using namespace std;
int main()
{
int numbers[] = {2, 4, 6, 8};
int i = 0;
for(i=0; i< numbers.size();i++)
cout << "the current number is " << numbers[i];
system("pause");
return 0;
}
J'obtiens une erreur sur la boucle de la ligne:
demande de membre
'size'
dans'numbers'
, ce qui est de la non-type de classe'int[4]'
- Vous disposez d'un tableau de listes...
- tableau a pas de taille de la fonction de membre et votre édition rend votre question invalide. il n'y a pas de liste plus de!
- Désolé, j'ai corrigé le code que j'ai eu! Et j'ai mis à jour le message d'erreur
Vous devez vous connecter pour publier un commentaire.
Contrairement à beaucoup de langues modernes du C++ tableaux n'ont pas
.size()
fonction. Vous avez un certain nombre d'options pour parcourir une liste en fonction du type de stockage.Des options communes pour le stockage comprennent:
Vos options pour l'itération dépend du type que vous utilisez. Si vous êtes en utilisant un simple vieux C tableau, vous pouvez stocker la taille de quelque part ou de calculer la taille de la matrice basée sur la taille de ce types. Le calcul de la taille d'un tableau a un certain nombre d'inconvénients décrits dans cette réponse par DevSolar
Si vous utilisez tout type qui fournit un
.begin()
et.end()
fonction, vous pouvez les utiliser pour obtenir un itérateur qui est considéré comme bon style en C++ par rapport à l'indice de l'itération:Vecteurs sont spéciaux parce qu'ils sont conçus pour être à la baisse-dans le remplacement pour les tableaux. Vous pouvez effectuer une itération sur un vecteur exactement comment vous le feriez sur un tableau avec un
.size()
fonction. Toutefois, cela est considéré comme une mauvaise pratique en C++ et vous devriez préférer utiliser des itérateurs si possible:C++11 (la nouvelle norme) apporte également de la nouvelle et de la fantaisie de la gamme en fonction de qui devrait fonctionner sur n'importe quel type qui fournit un
.begin()
et.end()
. Cependant: prise en charge du Compilateur peuvent varier pour cette fonction. Vous pouvez également utiliserbegin(type)
etend(type)
comme une alternative.std::begin
a aussi une autre propriété intéressante: il travaille sur des tableaux. Cela signifie que vous pouvez utiliser la même itération sémantique entre les tableaux et les non-tableaux (vous devez toujours préférer les types standard brut tableaux):Vous devez également être très prudent si vous voulez supprimer des éléments d'une collection, tandis que dans une boucle car l'appel de
container.erase()
rend tous les itérateurs invalide:Cette liste est loin d'être exhaustif, mais comme vous pouvez le voir il ya beaucoup de façons d'itération sur une collection. En général, préfèrent les itérateurs, sauf si vous avez une bonne raison de faire autrement.
Vous changer pour la boucle de
En termes simples,
sizeof(numbers)
nombre moyen d'éléments dans votre tableau * taille de type primitif int, de sorte que vous divisez parsizeof(int)
pour obtenir le nombre d'élémentssizeof(numbers)
parsizeof(int)
?Si vous faites en sorte qu'il est
list<int> numbers = {1,2,3,4}
:Itération à travers l'utilisation des itérateurs:
Itération à travers l'utilisation de
std::for_each
:En utilisant une boucle for-each (C++11):
Il n'y a pas de
size
la fonction de "plain" style C tableaux. Vous avez besoin d'utiliserstd::vector
si vous souhaitez utilisersize
, ou de calculer la taille parsizeof
.En C++11, vous pouvez utiliser la matrice de syntaxe d'initialisation pour initialiser vos vecteurs, comme ceci:
Tout le reste reste la même (voir démo ici).
std::array<int, 4>
?Vous pouvez également utiliser le bon vieux C conteneurs et utiliser l'itérateur syntaxe de la boucle:
Il n'est pas membre de la fonction "taille" parce que "nombre" n'est pas une classe. Vous ne pouvez pas obtenir la taille du tableau de cette façon, vous devez savoir (ou de calcul) ou à utiliser en classe pour stocker vos numéros.
La façon la plus simple de le faire, à mon avis, serait d'utiliser un span.
Notes:
g++ -o foo foo.cpp -I/path/to/gsl
span
fera partie de la norme, de sorte que vous suffit d'utiliserstd::span
et#include <span>
.Je ne l'ai pas vu parmi les réponses, mais c'est de l'omi, la meilleure façon de le faire: Gamme à base de boucle
Minimaliste et de travail exemple :