Ich benutze folgende:
replace (str1.begin(), str1.end(), 'a' , '')
Dies führt jedoch zu einem Kompilierungsfehler.
Grundsätzlich ersetzt replace
ein Zeichen durch ein anderes und ''
ist kein Zeichen. Was Sie suchen, ist erase
.
Siehe diese Frage die das gleiche Problem beantwortet. In deinem Fall:
#include <algorithm>
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
Oder verwenden Sie boost
, wenn dies für Sie eine Option ist, wie:
#include <boost/algorithm/string.hpp>
boost::erase_all(str, "a");
All dies ist gut dokumentiert auf ReferenzWebsites . Aber wenn Sie diese Funktionen nicht kennen, können Sie diese Dinge leicht von Hand tun:
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];
Der Algorithmus std::replace
arbeitet pro Element an einer bestimmten Sequenz (also ersetzt es Elemente durch andere Elemente und kann es nicht durch nichts) ersetzen. Aber es gibt kein leer Zeichen. Wenn Sie Elemente aus einer Sequenz entfernen möchten, müssen die folgenden Elemente verschoben werden und std::replace
funktioniert nicht so.
Sie können versuchen, std::remove
( zusammen mit std::erase
) um dies zu erreichen.
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
Mit 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;
}
So habe ich es gemacht.
Oder Sie könnten wie Antoine erwähnt tun:
Siehe diese Frage die das gleiche Problem beantwortet. In deinem Fall:
#include <algorithm> str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
Falls Sie ein predicate
und/oder ein nicht leeres output
haben, um es mit der gefilterten Zeichenfolge zu füllen, würde ich Folgendes in Betracht ziehen:
output.reserve(str.size() + output.size());
std::copy_if(str.cbegin(),
str.cend(),
std::back_inserter(output),
predicate});
In der ursprünglichen Frage ist das Prädikat [](char c){return c != 'a';}
Dieser Code beseitigt die Wiederholung von Zeichen, d. H. Wenn die Eingabe aaabbcc ist, ist die Ausgabe 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;