Eu tenho dois std::map<>objetos ae bgostaria de mover ( extract+ insert) alguns elementos (nós) de um mapa para outro com base em algum predicado p.
for (auto i = a.begin(); i != a.end(); ++i)
if (p(*i))
b.insert(a.extract(i))
Esse código é segmentado em clang. Suponho que o problema é o incremento de idepois que seu nó foi extraído de um.
É a maneira correta / única de corrigir isso usando um pós-incremento ?, Por exemplo:
for (auto i = a.begin(); i != a.end();)
if (p(*i))
b.insert(a.extract(i++))
else
++i;
Edição : Eu removi a parte sobre "por que isso funciona no gcc?", Porque não consigo reproduzir isso na minha configuração atual. Estou convencido de que isso costumava acontecer em algum momento, mas com o gcc 9.2.1 eu recebo um impasse (em vez de um segfault). De qualquer forma, incrementar depois extract()não está funcionando.
std::sete std::mapsão muito semelhantes, e até onde eu sei, extracttem as mesmas implicações de invalidação que erase.