Werbung

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

[C++ Quicktip] Iterieren in zufälliger Reihenfolge

Über einen Container in zufälliger Reihenfolge iterieren.

  1. -AB-

    -AB- Well-Known Member c-b Team

    -AB- hat eine neue Ressource erstellt:

    [C++ Quicktip] Iterieren in zufälliger Reihenfolge - Über einen Container in zufälliger Reihenfolge iterieren.

    Weitere Informationen zu dieser Ressource...
  2. coding-board

    coding-board Member

    Werbung
  3. German

    German Well-Known Member c-b Experte

    Die Idee Iteratoren in einen vector zu packen finde ich interessant :) Ich frag mich aber, wie sicher das ganze tatsächlich ist. Ich meine, wenn ein Container von vorn herein keine Random-Access-Iteratoren zur Verfügung stellt, hat das doch sicher einen Grund. Ist denn die Validität von Input-Iteratoren noch gewährleistet, wenn man sie in einem anderen Container sammelt? Immerhin sind das ja nur "vereinfachte" Forward-Iteratoren. Logisch wäre es denke ich schon, da ja zwischenzeitlich niemand Daten im Quellcontainer herumschubst und somit die Iteratoren immer noch auf die ursprünglichen Daten zeigen sollten (Multithreading schließt sich sowieso von selbst aus), andererseits kenne ich die genaue Implementation von Iteratoren für die einzelnen Containertypen nicht ...
  4. -AB-

    -AB- Well-Known Member c-b Team

    Prinzipiell, ja. Kopierbar sind sie alle.

    Und natürlich darf kein anderer Thread gleichzeitig auf den Container schreiben, das würde (unter Umständen) die Iteratoren invalidieren. (Die Umstände kommen auf den Container an.) Aber die gleiche Einschränkung gilt natürlich auch z.B. für std::for_each.

    Aber stimmt schon. Der Haken ist das initiale Iterieren: Es könnte auch jemand einen Input-Iterator rein geben - sagen wir, weil er eine Datei liest - und erwarten, dass es darauf auf funktioniert. Dazu heißt es: The previous iterator value is not required to be dereferenceable after the increase. Klar, wenn ich

    Damit "Multi-pass: neither dereferencing nor incrementing affects dereferenceability" gilt, müsste es ein Forward-Iterator sein. Könnte man mit 2 Zeilen meta-programming lösen :) - zumindest werd ich meinen template-Parameter mal umbenennen.
  5. German

    German Well-Known Member c-b Experte

    OK, jetzt ist das klar :)
  6. -AB-

    -AB- Well-Known Member c-b Team

    Ein bisschen template-meta-programmiert:
    Code (C++):
    Quelltext kopieren
    1. template <typename ForwardIterator, typename Action>
    2. typename std::enable_if<std::is_base_of<std::forward_iterator_tag, typename ForwardIterator::iterator_category>::value, Action>::type
    3. randomized_for_each(ForwardIterator first, ForwardIterator last, Action action)
    4. {
    5.     std::vector<ForwardIterator> iterators;
    6.     for(ForwardIterator iter = first;iter != last; ++iter)
    7.         iterators.emplace_back(iter);
    8.  
    9.     std::random_shuffle(iterators.begin(), iterators.end());
    10.  
    11.     std::for_each(iterators.begin(), iterators.end(),
    12.             [&action](const auto& elem)
    13.             {
    14.                 action(*elem);
    15.             }
    16.         );
    17.  
    18.     return action;
    19. }
    Dann braucht es noch eine Version für random_shuffle mit Generator, und eine, die std::shuffle unterstützt. Aber dann hat man alles. :)
    German gefällt das.
  7. German

    German Well-Known Member c-b Experte

    Ah! Zu Sachen wie enable_if bin ich bislang nicht vorgedrungen. Da muss ich mich tatsächlich noch ein bisschen einlesen :)
Die Seite wird geladen...
Ähnliche Themen - [C++ Quicktip] Iterieren Forum Datum
[C++ Quicktip] Iterieren in Zweierpärchen Ressourcen Diskussionen 22. September 2016
[C++ Quicktip] Stream Formatierung Ressourcen Diskussionen 2. Februar 2015
[C++] Webseiten Inhalt über Socket empfangen C/C++ 24. Juli 2017
[C++] Nummernformat ändern Ressourcen Diskussionen 15. Januar 2017
[C++] Funktion - Templatisierung ohne Überladung/Spezialisierung? C/C++ 20. November 2016