私は次を使用しています:
replace (str1.begin(), str1.end(), 'a' , '')
しかし、これはコンパイルエラーを引き起こしています。
基本的に、replace
は文字を別の文字に置き換え、''
は文字ではありません。探しているのはerase
です。
この質問 を参照してください。これは同じ問題に答えます。あなたの場合:
#include <algorithm>
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
または、次のように、オプションである場合はboost
を使用します。
#include <boost/algorithm/string.hpp>
boost::erase_all(str, "a");
このすべては、 referencewebsites で十分に文書化されています。ただし、これらの機能を知らなかった場合は、この種のことを手で簡単に行うことができます。
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];
アルゴリズムstd::replace
は、指定されたシーケンスで要素ごとに動作します(したがって、要素を別の要素に置き換え、nothing )。ただし、empty文字はありません。シーケンスから要素を削除する場合は、次の要素をmovedにする必要があり、std::replace
はこのようには機能しません。
これを達成するためにstd::remove
( std::erase
と一緒に )を使用することができます。
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
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;
}
これは私がやった方法です。
または、アントワーヌが言ったように行うことができます:
この質問 を参照してください。これは同じ問題に答えます。あなたの場合:
#include <algorithm> str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
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;
}
このコードは、文字の繰り返しを削除します。つまり、入力がaaabbccの場合、出力は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;
predicate
および/または非空のoutput
を使用して、フィルタリングされた文字列を入力する場合、以下を検討します。
output.reserve(str.size() + output.size());
std::copy_if(str.cbegin(),
str.cend(),
std::back_inserter(output),
predicate});
元の質問では、述語は[](char c){return c != 'a';}
です