Comment est la plage base de travail pour la plaine des tableaux?
En C++11, vous pouvez utiliser une gamme à base de for
, qui agit comme le foreach
d'autres langues. Il fonctionne même avec du C des tableaux:
int numbers[] = { 1, 2, 3, 4, 5 };
for (int& n : numbers) {
n *= 2;
}
Comment fait-il savoir quand s'arrêter? Il ne fait que travailler avec des tableaux statiques qui ont été déclarées dans le même champ d'application de la for
est utilisé? Comment utiliserez-vous cette for
avec des tableaux dynamiques?
- Il n'y a pas "dynamique" des tableaux en C ou C++ en soi - il y a des types de pile et puis il y a des pointeurs qui peut ou ne peut pas pointer vers un tableau ou un allouée dynamiquement bloc de mémoire qui pour la plupart se comporte comme un tableau. Pour n'importe quel tableau de type T[n], sa taille est codée dans le type et peut être consulté par
for
. Mais le moment que le tableau se désintègre à un pointeur, la taille de l'information est perdue. - Dans votre exemple, le nombre d'éléments dans
numbers
estsizeof(numbers)/sizeof(int)
, par exemple.
Vous devez vous connecter pour publier un commentaire.
Il fonctionne pour toute expression dont le type est un tableau. Par exemple:
Pour une explication plus détaillée, si le type de l'expression passée à droite de
:
est de type tableau, puis itération de la boucle deptr
àptr + size
(ptr
pointant vers le premier élément du tableau,size
étant l'élément le comte de la matrice).Ceci est en contraste à des types définis par l'utilisateur, qui travaillent en recherche de
begin
etend
en tant que membres si vous passez un objet de classe ou (si il n'y a pas de membres, appelle ainsi), non-membre de fonctions. Ces fonctions donnera le point de début et de fin des itérateurs (pointant directement après le dernier élément et le début de la séquence, respectivement).Cette question efface pourquoi cette différence existe.
begin
`fin. It just happens that
std::begin`std::end
utiliser les fonctions membres, et sera utilisé si une meilleure correspondance n'est pas disponible.clang
qui a C99 Soutien, est-ce encore du travail? Ou pas?Je pense que la partie la plus importante de cette question est, comment C++ sait ce que la taille d'un tableau est (au moins, je voulais savoir quand j'ai trouvé cette question).
C++ connaît la taille d'un tableau, parce que c'est une partie de la matrice de définition - c'est le type de la variable. Un compilateur doit connaître le type.
Depuis C++11
std::extent
peut être utilisé pour obtenir la taille d'un tableau:Bien sûr, cela n'a pas beaucoup de sens, parce que vous avez à fournir explicitement la taille à la première ligne, ce qui permet ensuite d'obtenir, à la deuxième ligne. Mais vous pouvez également utiliser
decltype
et puis ça devient plus intéressant:Selon le dernier C++ du Projet de Travail (n3376) à distance pour instruction est équivalente à la suivante:
Il sait comment arrêter de la même façon régulière
for
boucle à l'aide des itérateurs ne.Je pense que vous cherchez peut-être pour quelque chose comme ce qui suit afin de fournir un moyen d'utiliser la syntaxe ci-dessus avec des tableaux qui se composent de seulement un pointeur et de la taille (tableaux dynamiques):
Ce modèle de classe peut ensuite être utilisé pour créer une gamme, sur lequel vous pouvez effectuer une itération à l'aide de la nouvelle varié pour de la syntaxe. Je me sers de ce à courir à travers toutes les animations des objets dans une scène qui est importé à l'aide d'une bibliothèque qui ne retourne un pointeur vers un tableau et une taille de valeurs séparées.
Cette syntaxe est, à mon avis, beaucoup plus claire que ce que vous pourriez obtenir en utilisant
std::for_each
ou une plainefor
boucle.Il sait quand s'arrêter car il connaît les limites de tableaux statiques.
Je ne suis pas sûr qu'entendez-vous par "tableaux dynamiques", en tout cas, si ce n'est de parcourir des tableaux statiques, de manière informelle, le compilateur recherche les noms de
begin
etend
dans le champ d'application de la classe de l'objet que vous itérer sur, ou recherche pourbegin(range)
etend(range)
à l'aide de l'argument-dépendante de recherche et les utilise comme des itérateurs.Pour plus d'informations, dans le C++11 (ou de la version publique de celui-ci), "6.5.4 La gamme à base de
for
déclaration", pg.145new[]
. Dans ce cas, vous avez seulement un pointeur sans indication de la taille, donc il n'y a aucun moyen pour la gamme à base defor
de travailler avec elle.Est que de lire que, "me Dire ce qu'une attaque à distance pour ne (avec des tableaux)?"
Je vais répondre en supposant que Prendre l'exemple suivant à l'aide de tableaux imbriqués:
Version texte:
ia
est un tableau de tableaux ("tableau imbriqué"), contenant[3]
tableaux, contenant chacune[4]
valeurs. L'exemple ci-dessus boucles à traversia
en principal de "gamme" ([3]
), et, par conséquent, des boucles[3]
fois. Chaque boucle produit un desia
's[3]
primaire valeurs de départ de la première et se terminant avec le dernier - Un tableau contenant[4]
valeurs.pl
est égal à{1,2,3,4}
- Un tableaupl
est égal à{5,6,7,8}
- Un tableaupl
est égal à{9,10,11,12}
- Un tableauAvant de nous expliquer le processus, voici quelques rappels amicaux sur les tableaux:
pl
doit être une référence, car on ne peut pas copier des tableauxn
est le nombre en question, puisia[n]
est le même que*(ia+n)
(Nous faisons référence à l'adressen
entrées vers l'avant), etia+n
est le même que&ia[n]
(Nous sommes à recevoir l'adresse de l'entrée dans le tableau).Voici ce qu'il se passe:
pl
est défini comme un référence àia[n]
, avecn
égaler la boucle de courant, compter à partir de 0. Donc,pl
estia[0]
sur le premier tour, sur le second, il estia[1]
, et ainsi de suite. Il récupère la valeur par itération.ia+n
est à moins deend(ia)
....Et c'est tout.
C'est vraiment juste une simplifiée pour écrire ce:
Si votre tableau n'est pas imbriqué, ce processus devient un peu plus simple qu'une référence est pas nécessaire, parce que l'itération de la valeur n'est pas un tableau mais plutôt "normale" valeur:
Quelques informations supplémentaires
Que si nous ne voulions pas utiliser le
auto
mot-clé lors de la création depl
? A quoi cela ressemble?Dans l'exemple suivant,
pl
se réfère à unearray of four integers
. Sur chaque bouclepl
est donné la valeuria[n]
:Et... c'est comment ça fonctionne, avec des informations supplémentaires afin de repousser toute confusion. C'est juste une "abréviation'
for
boucle qui compte automatiquement pour vous, mais il lui manque un moyen de récupérer la boucle de courant sans le faire manuellement.