Idioma Erase-Remove_if para remoção de pares
Ao tentar empregar o idioma erase-remove_if para eliminar pares de um std::vector>, surge um problema peculiar. Apesar de almejar pares com um valor .first de 4 para remoção, a implementação inicial deixa para trás um par duplicado:
stopPoints.erase(std::remove_if(stopPoints.begin(), stopPoints.end(), [&](const stopPointPair stopPoint)-> bool { return stopPoint.first == 4; }));
A raiz do problema está no processo de apagamento incompleto. std::erase_if apenas desloca os elementos correspondentes para o final do vetor; isso não os remove. Para completar a remoção, a abordagem correta é usar o iterador retornado por std::remove_if como ponto de partida para o apagamento:
stopPoints.erase(std::remove_if(stopPoints.begin(), stopPoints.end(), [](const stopPointPair stopPoint)-> bool { return stopPoint.first == 4; }), stopPoints.end());
Compreendendo o mecanismo Erase-Remove_if:
Para obter mais informações, consulte o artigo da Wikipedia sobre [Apagar-Remover idioma](https://en.wikipedia.org/ wiki/Apagar-remove_idiom).
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3