11
votes

Itérer plusieurs std :: vecteur

J'ai lu ici et d'autres endroits qui, lors de l'itération d'une STD :: Vecteur Utilisation des index Vous devriez:

std::vector<double>::size_type


2 commentaires

Si vous avez été enseigné à propos de cela, vous avez mal appris. Outre le i ++ que tout compilateur décent doit optimiser à un ++ i , vous appelez toujours x.Size () à chaque tour de la boucle, que si elle est non triviale et non inine est inutile.


@Matthieu, juste un exemple rapide et sale pour illustrer ma question. Je devrais aussi utiliser des itérateurs et ne pas le faire par index.


5 Réponses :


2
votes

En général, la norme C ++ ne donne pas de telles garanties: aucune égalité de taille_types pour des conteneurs paramétrés différemment, ni égalité à taille_t.


2 commentaires

+1. Et vous aviez raison, le std :: size_t est garantie pour seulement allocataires. Je pensais std :: vecteur :: Taille_type devait être égal à allocator :: Taille_type , mais apparemment pas.


@avakar: La situation est que l'allocator standard utilise Taille_t pour sa taille_type, et toutes les implémentations connues des conteneurs standard transmettent le Taille_Type à partir de leur allocator associé. En conséquence, sauf si vous écrivez votre propre allocator, cela va être Taille_T. D'une perspective pratique, Taille_T va essentiellement fonctionner, peu importe ce qu'ils utilisent comme taille_type - par exemple. :: Opérateur Nouveau Utilise Taille_T pour la taille de l'allocation, et essentiellement toute autre allocation passe à travers celle (au moins par défaut).



7
votes

Oui, pour presque tous les fins pratiques, vous pouvez simplement utiliser STD :: Taille_T. Bien qu'il y ait (en quelque sorte) une intention que différents conteneurs puissent utiliser différents types pour leurs tailles, il est toujours essentiellement garanti que (au moins pour les conteneurs standard) Taille_Type est identique à Taille_T.

Alternativement, vous pouvez envisager d'utiliser un algorithme , quelque chose comme: xxx


0 commentaires

1
votes

Eh bien, je pense que:

 for (std::vector<int>::size_type i = 0; i < x.size(); i++){


3 commentaires

@Neil, aime le "Conseil de la perfection". J'utilisais sans signé Int mais la lecture de choses comme ceci: Stackoverflow. com / questions / 409348 / Itération-Over-Vector-in-C , fait que nous nous inquiétions. Probablement des inquiétudes non nécessaires.


@Neil: Vous ne vivrez jamais aussi longtemps - personne ne veut être blâmé perfectionniste, je suppose :-d


@Mark Si vous utilisez un type non signé, vous allez bien, IMHO. La réponse de LitB à la question que vous avez liée est (bien sûr) correcte, mais vous devez vraiment aimer taper (dans les deux sens) pour utiliser Taille_Type.



2
votes

Je pense que vous pouvez supposer en toute sécurité que ze_type est un entiteur non signé non signé. Vous ne pouvez pas compter sur beaucoup d'au-delà de cela. Bien sûr, la plupart des conteneurs ont un taille_type qui est identique à celui taille_t mais il n'y a pas de garantie.

La documentation SGI et cette source http://www.cplusplus.com/reference/ stl / vecteur / semble être d'accord sur le point.

Vous voudrez peut-être aussi consulter cette solution pour votre problème: http: //rosetacde.org/wiki/loopode_multiple_arrays_simultanément#c.2b.2b

J'espère que cela vous aidera.


0 commentaires

-1
votes

Vous devez utiliser des itérateurs plutôt xxx

car il n'y a aucune garantie que uze_type serait le même type interne, de toute façon, pour std :: vecteur vous pouvez itérer en utilisant non signé INT


2 commentaires

Pourquoi ne pas incrémenter j dans le corps de contrôle? Et vous souffrez aussi de ne pas utiliser de max ou extrémité pour vérifier la fin de l'itération ... Stick avec pour_ache vraiment;)


@MatthiEUM, comment pouvez-vous utiliser pour acheter lorsque vous devez faire itérair deux vecteurs différents? Évidemment, cet exemple est TRITE et les boucles peuvent être séparées, je ne peux pas penser à un moyen de le faire pour x [i] = y [i] + 3