Itération sur la paire d'éléments dans un conteneur de paires (C++)
Si j'ai un conteneur (vector
, list
, etc) dont chaque élément est un std::pair
, est-il un moyen facile pour effectuer une itération sur chaque élément de chaque paire?
c'est à dire
std::vector<std::pair<int,int> > a;
a.push_back(std::pair(1,3));
a.push_back(std::pair(2,3));
a.push_back(std::pair(4,2));
a.push_back(std::pair(5,2));
a.push_back(std::pair(1,5));
et d'être ensuite en mesure d'effectuer une itération sur la valeur: 1,3,2,3,4,2,5,2,1,5?
De même, ce type de foncteur/fonction serait de retour pour moi, un container (de même type) avec un plat de cotation de la paire d'éléments que ci-dessus?
std:paire ne nécessite pas de deux types de modèle à être du même type, de sorte qu'il n'a pas vraiment de sens d'avoir des méthodes pour faire ce que vous voulez essayer de faire.
Envisager de reconsidérer votre choix du conteneur. Semble que vous n'avez pas besoin d'une paire ici.
Envisager de reconsidérer votre choix du conteneur. Semble que vous n'avez pas besoin d'une paire ici.
OriginalL'auteur Shamster | 2009-11-30
Vous devez vous connecter pour publier un commentaire.
Pour aplatir votre conteneur de paires dans un deuxième récipient, vous pouvez aussi tout simplement écrire votre propre insertion:
Ou simplement se rendre compte que les objets sont conceptuellement plus facile, et peut presque toujours remplacer les coroutines. Et ils sont en C++ depuis le début. Honnêtement, un co-routine juste bundles état+, et les classes en faire de même.
Bien sûr, mais je parlais de lignes de code. Une coroutine n'est pas comme par magie tout faire d'une machine de Turing ne peut pas, mais il ne laisse vous
yield
sans avoir à enregistrer explicitement état, rappelez-vous où vous êtes à la hauteur, et puis faire un switch ou quoi que ce soit sur la ré-entrée de la fonction. Comme pour "conceptuellement plus facile" - meh. Coroutines peut faire de jolies choses cool avec le producteur-consommateur pipelines, ce qui est exactement ce que ces types de itérateur adaptateurs (ou plutôt ce qu'ils seraient, si elles n'ont pas été basés sur les classiques des appels de fonction).Qu'est ce qu'un doddle? Première fois que j'ai entendu ce mot, s'avère.
OriginalL'auteur Georg Fritzsche
Pour votre première, vous devez créer votre propre classe iterator, qui paires d'un indicateur indiquant le sein de la paire de position avec un
container<pair>
itérateurPour le second, il est plus facile, mais pour être aussi général que vous voulez (conteneurs de même type), vous avez besoin d'un modèle de définition de type. Voici pour juste vecteur:
Voici comment vous faux un modèle de définition de type:
std::pair<V,V>
Merci pour remarquer que - fixe.
OriginalL'auteur Jonathan Graehl
Le code suivant va imprimer toutes les valeurs requises:
Je préfère cette façon facile de créer des itérateur.
OriginalL'auteur Kirill V. Lyadvinsky
Il n'y a pas de moyen simple d'effectuer l'itération que vous voulez, mais vous voudrez peut-être prendre un coup d'oeil à l'boost::iterator_adaptor de la bibliothèque ou de mettre en œuvre votre propre itérateur de le faire (il ne devrait pas être trop complexe). Ensuite, sur la deuxième question, vous pouvez utiliser std::copie avec votre nouvel itérateur adaptateur.
OriginalL'auteur David Rodríguez - dribeas
Non, il n'y a vraiment pas une telle chose pour
std::pair
. Vous pouvez envisager d'utiliser un coup de pouce Tuple à la place. Un tuple est un peu comme une version élargie destd::pair
qui permet à un nombre arbitraire d'éléments (jusqu'à une certaine limite, mais normalement, au moins 10), et donne accès aux éléments de quelque chose comme un vecteur/matrice (c'est à dire vous pouvez accéder aux éléments par nom ou l'index).TR1 comprend également std::tr1::tuple, qui est un sous-ensemble de Boost n-uplet, mais si ma mémoire est bonne, il ne comprend toujours le nom/l'indice de la fonctionnalité que vous demandez.
Edit: notez que dans les deux cas, l'indice de notation nécessite un au moment de la compilation constante de l'indice, de sorte que vous ne pouvez pas écrire un (run-time) de la boucle d'itération sur les éléments d'un tuple -- mais vous pouvez faire le travail avec un peu de métaprogrammation. Boost de fusion comprend un peu à l'appui de ce que vous auriez besoin (par une étrange coïncidence, un tuple est une partie de la fusion de la bibliothèque).
OriginalL'auteur Jerry Coffin
À un certain point, vous devez utiliser première et deuxième, même si vous créez votre propre classe iterator. Je ne pense pas qu'il y a un moyen d'en sortir (au moins, d'une manière portable).
OriginalL'auteur Leandro T. C. Melo