es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

utilizando std::remove_if para iterar y eliminar entradas en deque

Estoy usando std::remove_if para iterar a través de una deque para eliminar elementos encontrados en una lista separada. La lógica parece sencilla pero mi código de prueba parece dejar artículos restantes en la deque que deberían haber sido eliminados. No puedo ver donde está el error en mi lógica.

int main()
{
    const int32_t STATUS_OK = 1;
    const int32_t STATUS_NOT_OK = 2;
    const int32_t STATUS_TEST = 3;

    std::deque<int32_t> error_codes;
    error_codes.push_front(STATUS_OK);
    error_codes.push_front(STATUS_NOT_OK);
    error_codes.push_front(STATUS_TEST);

    std::list<int32_t> ignored_codes;
    ignored_codes.push_back(STATUS_OK);
    ignored_codes.push_back(STATUS_NOT_OK);

    error_codes.erase(
        std::remove_if(
            begin(error_codes),
            end(error_codes),
            [ignored_codes](int32_t error_code) {
                for (auto ignore_code : ignored_codes)
                {
                    if (ignore_code == error_code)
                        return true;
                }
                return false;
                })
                // edit - esto es lo que faltaba:
                end(error_codes));        
    }

Al final de la ejecución, la variable error_codes muestra 2 elementos {3, 1} restantes en la deque. Si agrego un STATUS_NOT_OK adicional en los códigos de error, entonces me quedo con {3, 2, 1} en la deque error_codes, entonces… ¿Qué estoy haciendo mal?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema en el código proporcionado es que la función std::remove_if solo mueve los elementos no deseados al final del contenedor, pero en realidad no los elimina. Para eliminarlos por completo, el código debe llamar a la función erase después de remove_if, pasándole el iterador end del contenedor, que indica el nuevo final del contenedor después de que los elementos no deseados hayan sido movidos al final.

    El código corregido debería verse así:

    error_codes.erase(
        std::remove_if(
            begin(error_codes),
            end(error_codes),
            [ignored_codes](int32_t error_code) {
                for (auto ignore_code : ignored_codes) {
                    if (ignore_code == error_code)
                        return true;
                }
                return false;
            }),
        end(error_codes));
    

    Esto debería eliminar por completo todos los elementos en error_codes que aparecen en la lista ignored_codes.

Comments are closed.