Saya baru saja membaca beberapa rekomendasi tentang penggunaan
std::string s = get_string();
std::string t = another_string();
if( !s.compare(t) )
{
dari pada
if( s == t )
{
Saya hampir selalu menggunakan yang terakhir karena saya sudah terbiasa dan rasanya alami, lebih mudah dibaca. Saya bahkan tidak tahu bahwa ada fungsi perbandingan yang terpisah. Untuk lebih tepatnya, saya pikir == akan memanggil compare ().
Apa perbedaannya? Dalam konteks manakah sebaiknya satu cara disukai bagi yang lain?
Saya hanya mempertimbangkan kasus-kasus di mana saya perlu tahu apakah sebuah string bernilai sama dengan string lainnya.
if(x.compare(y) == 0)
<- sama dengan tanda, sama. Penggunaan IMO!
hanya berfungsi untuk membuat kode tidak dapat dibaca.compare
kembali-1
jikas
lebih rendah darit
dan+1
jikas
lebih besar daripadat
saat==
kembalitrue/false
. Bilangan nol bukantrue
dan0
sedangfalse
.Jawaban:
Inilah yang dikatakan standar tentang
operator==
Sepertinya tidak ada banyak perbedaan!
sumber
!s.compare(t)
dans == t
akan mengembalikan nilai yang sama, tetapi fungsi membandingkan memberikan lebih banyak informasi daripadas == t
, dans == t
lebih mudah dibaca ketika Anda tidak peduli bagaimana string berbeda tetapi hanya jika mereka berbeda.std :: string :: compare () mengembalikan sebuah
int
:s
dant
sama,s
kurang darit
,s
lebih besar darit
.Jika Anda ingin cuplikan kode pertama Anda sama dengan yang kedua, sebenarnya harus dibaca:
Operator kesetaraan hanya menguji kesetaraan (karenanya namanya) dan mengembalikan a
bool
.Untuk menguraikan kasus penggunaan,
compare()
dapat bermanfaat jika Anda tertarik pada bagaimana dua string berhubungan satu sama lain (kurang atau lebih besar) ketika keduanya berbeda. PlasmaHH menyebutkan pohon dengan benar, dan itu bisa juga, katakanlah, algoritma penyisipan string yang bertujuan untuk menjaga kontainer tetap diurutkan, algoritma pencarian dikotomik untuk wadah yang disebutkan di atas, dan sebagainya.EDIT: Seperti yang ditunjukkan Steve Jessop dalam komentar,
compare()
ini sangat berguna untuk algoritma pencarian cepat dan biner. Pencarian natural dan dikotomik dapat diimplementasikan dengan hanya std :: less .sumber
std::less
, yang juga merupakan urutan total dalam kasus ini) daripada pembanding tiga arah .compare()
adalah untuk operasi yang dimodelkanstd::qsort
danstd::bsearch
, sebagai lawan dari yang dimodelkan padastd:sort
danstd::lower_bound
.compare
memiliki kelebihan untuk membandingkan substring. Jika Anda membandingkan seluruh string, Anda hanya perlu menggunakan==
operator (dan apakah itu memanggilcompare
atau tidak cukup tidak relevan).sumber
Secara internal,
string::operator==()
menggunakanstring::compare()
. Silakan merujuk ke: CPlusPlus -string::operator==()
Saya menulis aplikasi kecil untuk membandingkan kinerja, dan ternyata jika Anda mengkompilasi dan menjalankan kode Anda pada lingkungan debug
string::compare()
sedikit lebih cepat daripadastring::operator==()
. Namun jika Anda mengkompilasi dan menjalankan kode Anda di lingkungan Release, keduanya hampir sama.FYI, saya menjalankan 1.000.000 iterasi untuk menghasilkan kesimpulan seperti itu.
Untuk membuktikan mengapa dalam lingkungan debug string :: bandingkan lebih cepat, saya pergi ke majelis dan di sini adalah kode:
DEBUG BUILD
string :: operator == ()
string :: bandingkan ()
Anda dapat melihat bahwa dalam string :: operator == (), ia harus melakukan operasi tambahan (tambahkan esp, 8 dan movzx edx, al)
PERS BUILD
string :: operator == ()
string :: bandingkan ()
Kedua kode assembly sangat mirip dengan kompiler melakukan optimasi.
Akhirnya, menurut pendapat saya, perolehan kinerja dapat diabaikan, oleh karena itu saya akan benar-benar menyerahkannya kepada pengembang untuk memutuskan mana yang lebih disukai karena keduanya mencapai hasil yang sama (terutama ketika itu rilis build).
sumber
compare()
setara dengan strcmp ().==
adalah pemeriksaan kesetaraan sederhana.compare()
Oleh karena itu mengembalikan sebuahint
,==
adalah boolean.sumber
compare()
akan kembalifalse
(well,0
) jika senarnya sama.Jadi jangan menganggap enteng pertukaran satu dengan yang lainnya.
Gunakan mana saja yang membuat kode lebih mudah dibaca.
sumber
Jika Anda hanya ingin memeriksa persamaan string, gunakan operator ==. Menentukan apakah dua string sama adalah lebih sederhana daripada menemukan pemesanan (yang memberikan perbandingan (),) sehingga mungkin lebih baik dalam hal kinerja untuk menggunakan operator kesetaraan.
Jawaban yang lebih panjang: API menyediakan metode untuk memeriksa persamaan string dan metode untuk memeriksa urutan string. Anda ingin kesetaraan string, jadi gunakan operator kesetaraan (sehingga harapan Anda dan harapan para pelaksana perpustakaan). Jika kinerjanya penting maka Anda mungkin ingin menguji kedua metode dan menemukan yang tercepat.
sumber
Misalkan pertimbangkan dua string s dan t.
Beri mereka beberapa nilai.
Ketika Anda membandingkannya menggunakan (s == t) itu mengembalikan nilai boolean (benar atau salah, 1 atau 0).
Tetapi ketika Anda membandingkan menggunakan s.compare (t) , ekspresi mengembalikan nilai
(i) 0 - jika s dan t sama
(ii) <0 - baik jika nilai karakter pertama yang tidak cocok dalam s kurang dari t atau panjang s lebih kecil dari t.
(iii) > 0 - baik jika nilai karakter pertama yang tidak cocok dalam t kurang dari s atau panjang t kurang dari s.
sumber
Satu hal yang tidak dibahas di sini adalah bahwa itu tergantung jika kita membandingkan string ke string c, string c ke string atau string ke string.
Perbedaan utama adalah bahwa untuk membandingkan kesetaraan ukuran dua string diperiksa sebelum melakukan perbandingan dan itu membuat operator == lebih cepat daripada membandingkan.
di sini adalah perbandingan seperti yang saya lihat di g ++ Debian 7
sumber