Ich habe zwei std::map<>Objekte aund bmöchte einige Elemente (Knoten) basierend auf einem Prädikat von einer Karte zur anderen verschieben ( extract+ insert) p.
for (auto i = a.begin(); i != a.end(); ++i)
if (p(*i))
b.insert(a.extract(i))
Dieser Code ist in clang fehlerhaft. Ich gehe davon aus, dass das Problem das Inkrement ist, inachdem sein Knoten aus a extrahiert wurde.
Ist dies der richtige / einzige Weg, um dies mithilfe eines Post-Inkrements zu beheben? ZB:
for (auto i = a.begin(); i != a.end();)
if (p(*i))
b.insert(a.extract(i++))
else
++i;
BEARBEITEN : Ich habe den Teil über "Warum funktioniert das in gcc?" Entfernt, da ich dies in meinem aktuellen Setup nicht reproduzieren kann. Ich bin überzeugt, dass es irgendwann einmal war, aber mit gcc 9.2.1 bekomme ich einen Deadlock (anstelle eines Segfault). In beiden Fällen extract()funktioniert das Inkrementieren nach nicht.
std::setund std::mapsind sehr ähnlich, und soweit ich das beurteilen kann, extracthat dies die gleichen Auswirkungen auf die Ungültigmachung wie erase.