Ai-je accès à des éléments de c++ std::map par un index entier?
J'ai une carte des éléments que je voudrais parcourir. Bien sûr, le niveau moyen de le faire c'est à l'aide d'une boucle for avec
for (map<string, int> iterator it = myMap.begin(); it != myMap.end(); ++it) {
string thisKey = it->first;
int thisValue = it->second;
}
mais si j'essaie de le faire cette boucle exécuter en parallèle en utilisant OpenMP est parallèle pour construire, il ne fonctionne pas, et c'est (apparemment) un problème connu, car il ne reconnaît pas cette sorte de boucle de construire.
Donc, mon plan de sauvegarde a été d'utiliser un index entier itérateur, et accéder à la liste des clés et les valeurs de l'indice, comme je le ferais en C# comme suit:
for (int i = 0; i < myMap.Count; ++i) {
string thisKey = myMap.Keys[i];
string thisValue = myMap.Values[i];
}
... pourtant, je n'arrive pas à trouver une méthode équivalente en C++. Est-il un moyen de le faire en C++ que je le sache?
std::map
est le meilleur récipient pour ce que souhaite accomplir?L'itération sur une carte est un arbre transversal, ce n'est pas une opération simple. Même si vous avez été en mesure de l'indice de la manière que vous voulez, il ne serait pas paralléliser pour vous.
combien de couples sont dans cette carte de la vôtre?
Marque: Merci, c'est à peu près répond à ma question. Je pense que ma solution actuelle (parcourir l'arbre et de copier les résultats dans des vecteurs, puis itérer sur les vecteurs) est probablement la meilleure façon d'aller. JK: pour cette application particulière, 99991.
OriginalL'auteur Charles | 2011-08-02
Vous devez vous connecter pour publier un commentaire.
Je ne sais rien à propos de OpenMP, donc je ne sais pas si il va optimiser la suite ou pas. Mais vous pouvez utiliser
std::advance
, comme suit:Mais sachez que
std::advance
est O(n), de sorte que votre (single-threaded) la complexité est O(n^2).MODIFIER: Si vous copiez la carte des éléments d'un vecteur, de réaliser que vous pouvez faire qui dans une déclaration:
ainsi:
Il pourrait être préférable de garder un seul vecteur de
map::value_type
. Voir mon edit. (Hmmm, mais qui nereserve
assez de mémoire initiale.)OriginalL'auteur Robᵩ
Voici quelques options qui sont relativement indolore.
Garder un
std::vector
oustd::deque
pour l'accès au tableau, et une carte distincte de valeurs. Le travail des jambes de s'assurer qu'ils sont conformes est votre problème.Utilisation boost::multi_index afin d'assurer la cohérence entre les deux structures d'index. Un mot d'avertissement, les temps de compilation sont assez long avec cette option. Pensez à utiliser le pimpl idiome si vous aller dans cette voie.
Je n'ai aucune expérience avec OpenMP, donc je ne peux pas spéculer si l'une de ces options serait utile dans la pratique.
OriginalL'auteur Tom Kerr