significa - remove data from vector c++



A biblioteca padrão C++ oferece uma versão mais compacta e generalizada do idioma apagar e remover? (1)

Podemos apagar um elemento / entrada de um contêiner pelo popular idioma apagar e apagar . No entanto, muitos de nós teriam encontrado alguns problemas ao aplicar esse idioma:

  • pode-se facilmente entrar na armadilha de erros como

    c.erase(std::remove_if(c.begin(), c.end(), pred));
    //                                             , c.end() //---> missing here

    ou

    c.erase((std::remove_if(c.begin(), c.end(), pred), c.end()))
    //      ^^                                               ^^
    // extra () makes it pass only c.end() to the c.erase
  • Ele segue mesmo a semântica errada para containers como std::list por não selecionar seu próprio membro std::list::remove_if() para o idioma.
  • Em terceiro lugar, usar std::remove_if não funciona para contêineres associativos .

Nós temos alguma coisa generalizada e menos propensa a erro do que std::erase-std::remove_if ou algo como std::erase_if dentro do escopo de c ++ 17 , ou haverá tal utilitário em c ++ 20 ?

https://ffff65535.com


Não no escopo do c ++ 17 , mas no c ++ 20 em diante!

Sim A proposta de eliminação consistente de contêineres foi mencionada no artigo n4009 e finalmente adotada no padrão C ++ 20 como std::erase_if que é uma função não membro para cada contêiner .

Isso garante uma semântica uniforme de eliminação de contêineres para std::basic_string e todos os contêineres padrão , exceto std::array (como o tamanho fixo).

Isso significa que o código clichê

container.erase(
    std::remove_if(
        container.begin(), container.end(),
        [](const auto& element) ->bool { return /* condition */; }),
    vec.end());

vai simplesmente derreter para uma forma generalizada de

std::erase_if(container, [](const auto& element) ->bool { return /* condition */; });

Em segundo lugar, essa sintaxe uniforme seleciona a semântica apropriada para cada contêiner . Isso significa

Além disso, o padrão também adicionou std::erase para contêineres de seqüência do formulário

std::erase(container, value_to_be_removed);




erase-remove-idiom