6
votes

Y a-t-il une syntaxe plus jolie pour un itérateur C ++?

Y a-t-il une solution plus jolie / moindre-verbeuse d'utiliser des itérateurs en C ++? Des tutoriels que j'ai vu, je configurais soit des typées partout (qui devient fastidieuse à faire pour beaucoup de boucles uniques): xxx

ou avoir des boucles de Verbose comme: xxx

y a-t-il une meilleure façon?


3 commentaires

Oui, utilisez c ++ 11 et dites auto !


Il aide également à utiliser des algorithmes stl lorsque vous pouvez éviter la syntaxe de la boucle.


Une autre idée est de Typedef votre conteneur. Cela rend ces déclarations d'itérateurs moins laides et plus maintenues. drdobbs.com/184401853


7 Réponses :


2
votes

Les algorithmes sont en quelque sorte ce problème particulier.
Surtout avec les nouvelles fonctions Lambda.

std::for_each(c.begin(), c.end(), [](type const& e) { /* Stuff */ });


7 commentaires

Le formulaire std :: for_ach (x.begin (), x.end (), ...) semble si courant que je suis surpris qu'il n'y ait pas beaucoup plus facile à taper / lire le sténographie pour cela ...


@Netmage: Il y en a maintenant. La gamme basée sur la déclaration est la nouvelle façon de le faire.


Pour moi, cela ressemble à un pour instruction et non une amélioration / remplacement sur le style de programmation fonctionnel. C # avec Linq a les deux.


@Netmage La langue C ++ ne place aucune limitation de la mise en œuvre. Donc, pour (;;) et pour (:) et std :: for_ach () peut être optimisé sous les couvercles selon les besoins. Comme pour Style de programmation fonctionnel Je ne sais pas comment cela est pertinent, en particulier comme C ++, est multi-paradigme.


Comment utilisez-vous pour (:) dans une chaîne?


@Netmage pourquoi voudriez-vous! Remarque: Multi-Paradigm signifie que vous pouvez utiliser le style le plus approprié.


Laissez-nous Continuez cette discussion en chat .



4
votes

avec boost , vous pouvez utiliser le pour_ach macro. XXX


3 commentaires

C'est même plus jolie avec C ++ 11 boost_foreach (const auto & i, avecteur)


C'est même plus plus jolie avec pure C ++ 11: pour (const auto & i: avecteur) {}


@In Silico, cela aurait dû être une réponse (voir combien de susvotes vous avez déjà).



-2
votes

Je définis habituellement cela, même si on m'a dit que je vais en enfer pour cela: xxx

puis, pour boucler de 0 à n, une tâche commune, je dis < Code> forn (i, n) foo (i); , et pour boucler tout conteneur standard C, je dis Forall (it, c) foo (it); Notez que Notez que code> typeof est une extension GCC à la norme.


1 commentaires

Bien sûr, vous êtes! Vous comptez sur les extensions de compilateur Macros + lorsque vous pourriez utiliser des fonctions modèles + prédicats :)



2
votes

avec C ++ 0x Vous pouvez utiliser le mot-clé AUTO:

for (auto i = v.begin(); i != v.end(); ++i) {}


3 commentaires

Juste curieux: la méthode .begin () peut renvoyer les deux itérateur et const_itéator . Comment, en utilisant la syntaxe C ++ 0X, puis-je dire au compilateur que je veux const_iterator ?


@ Michał: Utilisez .cbegin () et .cend () Pour spécifier const_itéatrice


@MICHAL: Cela dépend de la const-ness de v . Si v n'est pas const , alors la surcharge non-const est sélectionnée. Comme le dit BlastFurnace, C ++ 0x Introduisez une nouvelle paire cbegin / cend pour permettre à const_iterator à partir d'un conteneur non constitué sans piratage.



0
votes

Une possibilité est d'écrire votre boucle (ou quel que soit le code qui utilise l'itérateur) dans un algorithme de petite taille. En faisant un modèle, le compilateur peut / déduire le type d'itérateur automatiquement:

template <class T>
do_something(T begin, T end) { 
    for (T pos = begin; pos != end; ++pos) 
        do_something_with(*pos);
}


0 commentaires

8
votes

in c ++ 11 Vous pouvez utiliser la plage pour la boucle combinée avec le mot-clé AUTO:

for (auto& it : v) ...


0 commentaires

1
votes

J'utilise habituellement le modèle de dénomination suivant: xxx

puis utiliser blahs :: itérateur , c'est-à-dire que je ne nommez pas l'itérateur mais le conteneur (et généralement la chose contenue dedans).
Typedef est un mécanisme d'abstraction très utile.

Notez qu'un vecteur de "bla" s'appelle "bla" (c'est-à-dire juste le pluriel), pas un "blahavecteur", car le conteneur spécifique n'a pas d'importance.


0 commentaires