Hoe verwijder je alle voorkomens van een char in c++ string

Ik gebruik het volgende:

replace (str1.begin(), str1.end(), 'a' , '')

Maar dit geeft een compilatiefout.


Antwoord 1, autoriteit 100%

Kortom, replace vervangt een teken door een ander en '' is geen teken. Wat je zoekt is erase.

Zie deze vraag die hetzelfde probleem beantwoordt. In jouw geval:

#include <algorithm>
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());

Of gebruik boost als dat een optie voor je is, zoals:

#include <boost/algorithm/string.hpp>
boost::erase_all(str, "a");

Dit alles is goed gedocumenteerd op referentie websites. Maar als u deze functies niet kende, zou u dit soort dingen gemakkelijk met de hand kunnen doen:

std::string output;
output.reserve(str.size()); // optional, avoids buffer reallocations in the loop
for(size_t i = 0; i < str.size(); ++i)
  if(str[i] != 'a') output += str[i];

Antwoord 2, autoriteit 6%

Het algoritme std::replace werkt per element op een bepaalde reeks (dus het vervangt elementen door andere elementen en kan het niet vervangen door niets). Maar er is geen leeg teken. Als je elementen uit een reeks wilt verwijderen, moeten de volgende elementen verplaatst worden, en std::replace werkt niet zo.

Je kunt proberen std::remove (samen met std::erase) om dit te bereiken.

str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());

Antwoord 3, autoriteit 5%

Gebruik copy_if:

#include <string>
#include <iostream>
#include <algorithm>
int main() {
    std::string s1 = "a1a2b3c4a5";
    char s2[256];
    std::copy_if(s1.begin(), s1.end(), s2, [](char c){return c!='a';});
    std::cout << s2 << std::endl;
    return 0;
}

Antwoord 4, autoriteit 3%

string RemoveChar(string str, char c) 
{
   string result;
   for (size_t i = 0; i < str.size(); i++) 
   {
          char currentChar = str[i];
          if (currentChar != c)
              result += currentChar;
   }
       return result;
}

Zo heb ik het gedaan.

Of je zou kunnen doen wat Antoine zei:

Bekijk dit
vraag

die hetzelfde probleem beantwoordt. In jouw geval:

#include <algorithm>
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());

Antwoord 5

In het geval dat je een predicate en/of een niet-lege output hebt om te vullen met de gefilterde tekenreeks, zou ik overwegen:

output.reserve(str.size() + output.size());  
std::copy_if(str.cbegin(), 
             str.cend(), 
             std::back_inserter(output), 
             predicate});

In de oorspronkelijke vraag is het predikaat [](char c){return c != 'a';}


Antwoord 6

Deze code verwijdert herhaling van tekens, d.w.z. als de invoer aaabbcc is, is de uitvoer abc. (de array moet gesorteerd zijn om deze code te laten werken)

cin >> s;
ans = "";
ans += s[0];
for(int i = 1;i < s.length();++i)
if(s[i] != s[i-1])
    ans += s[i];
cout << ans << endl;

Antwoord 7

Op basis van andere antwoorden volgt hier nog een voorbeeld waarbij ik alle speciale tekens in een bepaalde tekenreeks heb verwijderd:

#include <iostream>
#include <string>
#include <algorithm>
std::string chars(".,?!.:;_,!'\"-");
int main(int argc, char const *argv){
  std::string input("oi?");
  std::string output = eraseSpecialChars(input);   
 return 0;
}
std::string eraseSpecialChars(std::string str){
std::string newStr;
    newStr.assign(str);  
    for(int i = 0; i < str.length(); i++){
        for(int  j = 0; j < chars.length(); j++ ){
            if(str.at(i) == chars.at(j)){
                char c = str.at(i);
                newStr.erase(std::remove(newStr.begin(), newStr.end(), c), newStr.end());
            }
        }
    }      
return newStr; 
}

Invoer versus uitvoer:

Input:ra,..pha
Output:rapha
Input:ovo,
Output:ovo
Input:a.vo
Output:avo
Input:oi?
Output:oi

Antwoord 8

Ik heb een string die wordt gelezen:

"\"internet\""

en ik wil de aanhalingstekens verwijderen. Ik heb de hierboven voorgestelde oplossing std::erase gebruikt:

str.erase(std::remove(str.begin(), str.end(), '\"'), str.end());

maar toen ik het resultaat deed, mislukte het:

if (str == "internet") {}

Wat ik eigenlijk kreeg was:

"internet "

De std::erase / std::remove oplossing verkort de string niet wanneer het einde wordt verwijderd. Ik heb dit toegevoegd (van https://stackoverflow.com/a/21815483/264822):

str.erase(std::find_if(str.rbegin(), str.rend(), std::bind1st(std::not_equal_to<char>(), ' ')).base(), str.end());

om de volgende spatie(s) te verwijderen.


Antwoord 9

Ik denk dat de methode std:remove werkt, maar het gaf een compatibiliteitsprobleem met de include, dus uiteindelijk schreef ik deze kleine functie:

string removeCharsFromString(const string str, char* charsToRemove )
{
    char c[str.length()+1]; // + terminating char
    const char *p = str.c_str();
    unsigned int z=0, size = str.length();
    unsigned int x;
    bool rem=false;
    for(x=0; x<size; x++)
    {
        rem = false;
        for (unsigned int i = 0; charsToRemove[i] != 0; i++)
        {
            if (charsToRemove[i] == p[x])
            {
                rem = true;
                break;
            }
        }
        if (rem == false) c[z++] = p[x];
    }
    c[z] = '\0';
    return string(c);
}

Gewoon gebruiken als

myString = removeCharsFromString(myString, “abc\r”);

en het zal alle voorkomen van de gegeven tekenlijst verwijderen.

Dit kan ook een beetje efficiënter zijn omdat de lus terugkeert na de eerste wedstrijd, dus we doen eigenlijk minder vergelijkingen.


Antwoord 10

Dit is hoe ik het doe:

std::string removeAll(std::string str, char c) {
    size_t offset = 0;
    size_t size = str.size();
    size_t i = 0;
    while (i < size - offset) {
        if (str[i + offset] == c) {
            offset++;
        }
        if (offset != 0) {
            str[i] = str[i + offset];
        }
        i++;
    }
    str.resize(size - offset);
    return str;
}

In principe wanneer ik een bepaalde char vind, verschuif ik de offset en verplaats ik de char naar de juiste index. Ik weet niet of dit correct of efficiënt is, ik begin (opnieuw) bij C++ en ik zou elke input hierover op prijs stellen.


Antwoord 11

70% snellere oplossing dan het beste antwoord

        void removeCharsFromString(std::string& str, const char* charsToRemove)
        {
            size_t charsToRemoveLen = strlen(charsToRemove);
            std::remove_if(str.begin(), str.end(), [charsToRemove, charsToRemoveLen](char ch) -> bool
                {
                    for (int i = 0; i < charsToRemoveLen; ++i) {
                        if (ch == charsToRemove[i])
                            return true;
                    }
                    return false;
                });
        }

Antwoord 12

#include <string>
#include <algorithm>
std::string str = "YourString";
char chars[] = {'Y', 'S'};
str.erase (std::remove(str.begin(), str.end(), chars[i]), str.end());

Zal hoofdletters Y en S uit str verwijderen, waardoor “ourtring” overblijft.

Merk op dat remove een algoritme is en de header <algorithm> moet bevatten.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes