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ß?
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:
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%Hier sind ein paar Optionen, die relativ schmerzlos sind.
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.
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.