私は以下を使用しています:
replace (str1.begin(), str1.end(), 'a' , '')
しかし、これはコンパイルエラーを引き起こしています。
私は以下を使用しています:
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");
これらのすべては、参照 Webサイトに十分に文書化されています。しかし、これらの機能を知らなかった場合は、このようなことを手で簡単に行うことができます。
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];
O(n^2)
か?
n
、元の文字列の長さだと思います。入力文字ごとに、1文字のテストO(1)
と0または1文字の追加を行います。文字追加はO(1)
、十分なメモリが予約されているか、またはO(current_length)
新しいバッファが割り当てられている場合です。output.reserve(str.size())
ループの前に行うと、これは発生せず、グローバルなO(n)
コストがかかります。それ以外の場合は漸近的に、コストはO(n . log(n) )
STLコンテナーの再割り当て戦略が原因であると思います。
for
最も適しています。
アルゴリズムは、指定されたシーケンスの要素ごとにstd::replace
機能します(そのため、要素を別の要素で置き換え、何も置き換えられません)。しかし、空の文字はありません。シーケンスから要素を削除したい場合、次の要素を移動する必要があり、このように動作しません。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());
他の回答に基づいて、ここに私が与えられた文字列のすべての特殊文字を削除したもう1つの例があります:
#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;
}
入力と出力:
Input:ra,..pha
Output:rapha
Input:ovo,
Output:ovo
Input:a.vo
Output:avo
Input:oi?
Output:oi
std:removeメソッドは機能すると思いますが、インクルードとの互換性の問題がいくつかあったため、次の小さな関数を作成しました。
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);
}
ちょうどとして使用
myString = removeCharsFromString(myString、 "abc \ r");
そして、与えられた文字リストのすべての出現を削除します。
ループは最初の一致の後に戻るため、これは少し効率的かもしれません。したがって、実際には比較を少なくします。
これが私のやり方です:
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;
}
基本的に、与えられたcharを見つけるたびに、オフセットを進め、charを正しいインデックスに再配置します。これが正しいか効率的かはわかりませんが、(まだ)C ++から始めています。
#include <string>
#include <algorithm>
std::string str = "YourString";
char chars[] = {'Y', 'S'};
str.erase (std::remove(str.begin(), str.end(), chars[i]), str.end());
大文字のYとSをstrから削除し、「ourtring」を残します。
これremove
はアルゴリズムであり、ヘッダーを<algorithm>
含める必要があることに注意してください。
''
確かにキャラクターではありません。