web-dev-qa-db-ja.com

C ++文字列内の文字のすべての出現を削除する方法

私は次を使用しています:

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

しかし、これはコンパイルエラーを引き起こしています。

80
Devesh Agrawal

基本的に、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];
143
Antoine

アルゴリズムstd::replaceは、指定されたシーケンスで要素ごとに動作します(したがって、要素を別の要素に置き換え、nothing )。ただし、empty文字はありません。シーケンスから要素を削除する場合は、次の要素をmovedにする必要があり、std::replaceはこのようには機能しません。

これを達成するためにstd::removestd::eraseと一緒に )を使用することができます。

str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
8
leemes
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());
3
Rafael Valle

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;
}
3
perreal

このコードは、文字の繰り返しを削除します。つまり、入力が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;
1
shivakrishna9

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';}です

0
jimifiki