J'utilise ce qui suit:
replace (str1.begin(), str1.end(), 'a' , '')
Mais cela donne une erreur de compilation.
Fondamentalement, replace
remplace un caractère par un autre et ''
n'est pas un caractère. Ce que vous cherchez, c'est erase
.
Voir cette question qui répond au même problème. Dans ton cas:
#include <algorithm>
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
Ou utilisez boost
si c'est une option pour vous, comme:
#include <boost/algorithm/string.hpp>
boost::erase_all(str, "a");
Tout cela est bien documenté sur référencesites Web . Mais si vous ne connaissiez pas ces fonctions, vous pourriez facilement faire ce genre de choses à la main:
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];
L'algorithme std::replace
fonctionne par élément sur une séquence donnée (il remplace donc des éléments par des éléments différents et ne peut pas le remplacer par rien ). Mais il n'y a pas de caractère vide . Si vous souhaitez supprimer des éléments d'une séquence, les éléments suivants doivent être déplacés et std::replace
ne fonctionne pas comme cela.
Vous pouvez essayer d'utiliser std::remove
( avec std::erase
) pour y parvenir.
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
Utiliser 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;
}
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;
}
Voici comment je l'ai fait.
Ou vous pourriez faire comme Antoine a mentionné:
Voir cette question qui répond au même problème. Dans ton cas:
#include <algorithm> str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
Si vous avez un predicate
et/ou un output
non vide à remplir avec la chaîne filtrée, je considérerais:
output.reserve(str.size() + output.size());
std::copy_if(str.cbegin(),
str.cend(),
std::back_inserter(output),
predicate});
Dans la question initiale, le prédicat est [](char c){return c != 'a';}
Ce code supprime la répétition des caractères, c'est-à-dire que si l'entrée est aaabbcc, le résultat sera abc.
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;