Karakters verwijderen die overeenkomen met een patroon

C++:
Karakters verwijderen die overeenkomen met een patroon

Hoe:

Laten we tekens verwijderen met erase en remove_if samen met lambda-expressies. Hier is een snel voorbeeld:

#include <iostream>
#include <algorithm>
#include <string>

int main() {
    std::string data = "B4n4n4!";

    // Verwijder alle numerieke tekens
    data.erase(std::remove_if(data.begin(), data.end(), ::isdigit), data.end());
    
    std::cout << data << std::endl; // Uitvoer: Bnn!
    
    return 0;
}

Voorbeelduitvoer:

Bnn!

Diepgang

Het algoritme std::remove_if uit de <algorithm>-header verkleint de string eigenlijk niet; het herordent elementen en retourneert een pointer naar het nieuwe logische einde. De erase-methode van de std::string-klasse verwijdert vervolgens het “dode hout” van het einde. Deze combinatie is er sinds C++98 en blijft efficiënt en populair.

Alternatieven? Voor complexe patronen is regex (<regex>) je Zwitsers zakmes. Maar, het is overkill voor eenvoudige klusjes.

Details? std::remove_if en vergelijkbare algoritmes leunen op iterators, die C++ heeft overgenomen van de Standard Template Library (STL) midden jaren 90. Ze bevorderen generiek programmeren, waardoor je knip-en-verander-code werkt op strings, lijsten, noem maar op.

Zie Ook