Saya menggunakan berikut ini:
replace (str1.begin(), str1.end(), 'a' , '')
Tapi ini memberikan kesalahan kompilasi.
Saya menggunakan berikut ini:
replace (str1.begin(), str1.end(), 'a' , '')
Tapi ini memberikan kesalahan kompilasi.
Jawaban:
Pada dasarnya, replace
mengganti karakter dengan karakter lain dan ''
bukan karakter. Apa yang Anda cari adalah erase
.
Lihat pertanyaan ini yang menjawab masalah yang sama. Dalam kasus Anda:
#include <algorithm>
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
Atau gunakan boost
jika itu pilihan untuk Anda, seperti:
#include <boost/algorithm/string.hpp>
boost::erase_all(str, "a");
Semua ini didokumentasikan dengan baik di situs web referensi . Tetapi jika Anda tidak mengetahui fungsi-fungsi ini, Anda dapat dengan mudah melakukan hal-hal semacam ini dengan tangan:
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
merupakan panjang string asli. Untuk setiap karakter input, saya melakukan tes 1 karakter O(1)
, dan 0 atau 1 karakter menambahkan. Penambahan karakter O(1)
adalah mencadangkan cukup memori, atau O(current_length)
jika buffer baru dialokasikan. Jika Anda melakukannya output.reserve(str.size())
sebelum pengulangan, ini tidak pernah terjadi dan Anda memiliki O(n)
biaya global . Jika tidak, secara asimtotik, saya kira biayanya O(n . log(n) )
karena strategi realokasi kontainer STL.
for
adalah yang paling cocok.
Algoritme std::replace
bekerja per elemen pada urutan tertentu (sehingga menggantikan elemen dengan elemen yang berbeda, dan tidak dapat menggantikannya dengan tidak ada ). Tetapi tidak ada karakter kosong . Jika Anda ingin menghapus elemen dari urutan, elemen berikut harus dipindahkan , dan std::replace
tidak berfungsi seperti ini.
Anda dapat mencoba menggunakan std::remove
( bersama denganstd::erase
) untuk mencapai ini.
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;
}
Beginilah cara saya melakukannya.
Atau Anda bisa melakukan seperti yang Antoine sebutkan:
Lihat pertanyaan ini yang menjawab masalah yang sama. Dalam kasus Anda:
#include <algorithm> str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
Jika Anda memiliki predicate
dan / atau yang tidak kosong output
untuk diisi dengan string yang difilter, saya akan mempertimbangkan:
output.reserve(str.size() + output.size());
std::copy_if(str.cbegin(),
str.cend(),
std::back_inserter(output),
predicate});
Dalam pertanyaan awal, predikatnya adalah [](char c){return c != 'a';}
Kode ini menghilangkan pengulangan karakter yaitu, jika input adalah aaabbcc maka output akan menjadi abc. (array harus diurutkan agar kode ini berfungsi)
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;
Berdasarkan jawaban lain, inilah satu contoh lagi di mana saya menghapus semua karakter khusus dalam string tertentu:
#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 vs Output:
Input:ra,..pha
Output:rapha
Input:ovo,
Output:ovo
Input:a.vo
Output:avo
Input:oi?
Output:oi
Saya kira metode std: hapus berfungsi tetapi memberikan beberapa masalah kompatibilitas dengan penyertaan jadi saya akhirnya menulis fungsi kecil ini:
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);
}
Gunakan saja sebagai
myString = removeCharsFromString (myString, "abc \ r");
dan itu akan menghapus semua kemunculan daftar karakter yang diberikan.
Ini juga mungkin sedikit lebih efisien karena loop kembali setelah pertandingan pertama, jadi kami sebenarnya melakukan lebih sedikit perbandingan.
Inilah cara saya melakukannya:
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;
}
Pada dasarnya setiap kali saya menemukan char tertentu, saya memajukan offset dan memindahkan char ke indeks yang benar. Saya tidak tahu apakah ini benar atau efisien, saya mulai (lagi) di C ++ dan saya akan menghargai masukan apa pun tentang itu.
#include <string>
#include <algorithm>
std::string str = "YourString";
char chars[] = {'Y', 'S'};
str.erase (std::remove(str.begin(), str.end(), chars[i]), str.end());
Akan menghapus kapital Y dan S dari str, meninggalkan "ourtring".
Perhatikan bahwa itu remove
adalah algoritme dan memerlukan header yang <algorithm>
disertakan.
''
memang bukan karakter.