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 loopfor(size_t i =0; i < str.size();++i)if(str[i]!='a') output += str[i];
@ Jww: Saya menganggap Anda sedang berbicara tentang contoh kode terakhir dan nmerupakan 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.
Antoine
5
Saya perlu #include <algorithm>
S Meaden
Jawaban bagus. Selalu bagus jika jawabannya mengandung banyak solusi. Bagi saya, solusi dengan the foradalah yang paling cocok.
Dmitry Nichiporenko
@DmitryNichiporenko, jawaban untuk tidak mungkin yang paling cocok. Jika Anda memiliki predikat atau keluaran yang tidak kosong, saya lebih suka mempertimbangkan: output.reserve (str.size () + output.size ()); std :: copy_if (str.begin (), str.end (), std :: back_inserter (keluaran), [] (char c) {return predicate (c);});
jimifiki
11
Algoritme std::replacebekerja 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::replacetidak berfungsi seperti ini.
stringRemoveChar(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:
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;
Anda menebak dengan benar. Daripada menulis sendiri, lebih baik cari tahu mengapa Anda tidak dapat menggunakan header C ++ standar.
xtofl
Nah itu pendapat pribadi xtofl, Tidak selalu baik untuk menggunakan kode 3 Anda sebenarnya tidak tahu apa yang dilakukannya atau kinerja daripada menulis apa yang Anda butuhkan secara khusus.
Damien
1
Aku mengerti apa yang kamu maksud. Kerendahan hati itulah yang membuat saya memilih versi yang telah ditinjau, diuji, dioptimalkan oleh penulis perpustakaan profesional penuh waktu, daripada versi saya sendiri. The standar perpustakaan dapat dianggap sebagai pengetahuan yang diperlukan: fungsinya serta kompleksitas runtime nya.
xtofl
Selain string, Ini adalah solusi C untuk masalah C ++. Saya tidak berpikir ini seharusnya ditolak.
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.
''
memang bukan karakter.Jawaban:
Pada dasarnya,
replace
mengganti karakter dengan karakter lain dan''
bukan karakter. Apa yang Anda cari adalaherase
.Lihat pertanyaan ini yang menjawab masalah yang sama. Dalam kasus Anda:
Atau gunakan
boost
jika itu pilihan untuk Anda, seperti: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:
sumber
O(n^2)
?n
merupakan panjang string asli. Untuk setiap karakter input, saya melakukan tes 1 karakterO(1)
, dan 0 atau 1 karakter menambahkan. Penambahan karakterO(1)
adalah mencadangkan cukup memori, atauO(current_length)
jika buffer baru dialokasikan. Jika Anda melakukannyaoutput.reserve(str.size())
sebelum pengulangan, ini tidak pernah terjadi dan Anda memilikiO(n)
biaya global . Jika tidak, secara asimtotik, saya kira biayanyaO(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 , danstd::replace
tidak berfungsi seperti ini.Anda dapat mencoba menggunakan
std::remove
( bersama denganstd::erase
) untuk mencapai ini.sumber
Menggunakan
copy_if
:sumber
Beginilah cara saya melakukannya.
Atau Anda bisa melakukan seperti yang Antoine sebutkan:
sumber
Jika Anda memiliki
predicate
dan / atau yang tidak kosongoutput
untuk diisi dengan string yang difilter, saya akan mempertimbangkan:Dalam pertanyaan awal, predikatnya adalah
[](char c){return c != 'a';}
sumber
Kode ini menghilangkan pengulangan karakter yaitu, jika input adalah aaabbcc maka output akan menjadi abc. (array harus diurutkan agar kode ini berfungsi)
sumber
Berdasarkan jawaban lain, inilah satu contoh lagi di mana saya menghapus semua karakter khusus dalam string tertentu:
Input vs Output:
sumber
Saya kira metode std: hapus berfungsi tetapi memberikan beberapa masalah kompatibilitas dengan penyertaan jadi saya akhirnya menulis fungsi kecil ini:
Gunakan saja sebagai
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.
sumber
Inilah cara saya melakukannya:
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.
sumber
Akan menghapus kapital Y dan S dari str, meninggalkan "ourtring".
Perhatikan bahwa itu
remove
adalah algoritme dan memerlukan header yang<algorithm>
disertakan.sumber