Kann ich auf die Elemente in einer c ++ std :: map durch einen Integer-Index zugreifen?

8

Ich habe eine Karte von Elementen, die ich durchspielen möchte. Natürlich wäre das der übliche Weg, eine for-Schleife mit

zu verwenden %Vor%

Aber wenn ich versuche, diese Schleife parallel laufen zu lassen, benutze OpenMPs parallel für -Konstrukte, funktioniert das nicht, und dies ist (anscheinend) ein bekanntes Problem, da es diese Art nicht erkennt des Schleifenkonstrukts.

Mein Backup-Plan bestand also darin, einen Integer-Index-Iterator zu verwenden und auf die Liste der Schlüssel und Werte nach Index zuzugreifen, so wie ich es in C # tun würde:

%Vor%

... noch kann ich keine äquivalente Methode in C ++ finden. Gibt es eine Möglichkeit, dies in C ++ zu tun, von dem ich nichts weiß?

    
Charles 02.08.2011, 21:52
quelle

2 Antworten

7

Ich weiß nichts über OpenMP , also weiß ich nicht, ob es das Folgende optimiert oder nicht. Aber Sie könnten std::advance wie folgt verwenden:

%Vor%

Beachten Sie jedoch, dass std::advance O (n) ist, also Ihre (single-threaded) Komplexität ist O (n ^ 2).

BEARBEITEN : Wenn Sie die Kartenelemente in einen Vektor kopieren, können Sie dies in einer Deklaration tun: %Vor%

also:

%Vor%     
Robᵩ 02.08.2011 22:02
quelle
5

Hier sind ein paar Optionen, die relativ schmerzlos sind.

  1. Behalten Sie einen std::vector oder std::deque für den Array-Zugriff und eine separate Zuordnung von Werten bei. Die Aufgabe, sicherzustellen, dass sie konsistent sind, ist Ihr Problem.

  2. Verwenden Sie boost :: multi_index , um Konsistenz zu gewährleisten zwischen den beiden Indexstrukturen. Als ein Wort der Warnung, Kompilierzeiten sind ziemlich lang mit dieser Option. Verwenden Sie das Pimpl-Idiom , wenn Sie diesen Weg gehen.

Ich habe keine Erfahrung mit OpenMP, daher kann ich nicht darüber spekulieren, ob sich eine dieser Optionen in der Praxis lohnt.

    
Tom Kerr 02.08.2011 22:10
quelle

Tags und Links