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.