std :: string length () dan size () fungsi anggota

265

Saya membaca jawaban untuk ini pertanyaan dan menemukan bahwa sebenarnya ada metode yang disebut length()untuk std::string(saya selalu digunakan size()). Apakah ada alasan khusus untuk menggunakan metode ini di std::stringkelas? Saya membaca MSDN dan CppRefernce, dan mereka tampaknya menunjukkan bahwa tidak ada perbedaan antara size()dan length(). Jika begitu, bukankah itu membuat lebih membingungkan bagi pengguna kelas?

Naveen
sumber

Jawaban:

342

Sesuai dokumentasi , ini hanya sinonim. size()apakah ada untuk konsisten dengan wadah STL lainnya (seperti vector, map, dll ) dan length()ini konsisten dengan gagasan intuitif sebagian besar orang string karakter. Orang-orang biasanya berbicara tentang kata, kalimat atau panjang paragraf , bukan ukurannya, jadi length()apakah ada untuk membuat hal-hal lebih mudah dibaca.

Todd Gamblin
sumber
9
Sepakat. Ketika saya menulis kelas template dan fungsi saya lebih suka menggunakan size()(Jika saya pernah menggunakan kelas non-string), tetapi sebagian besar waktu saya gunakan length()ketika bekerja dengan string biasa.
Marius
3
Bukankah size () mengembalikan ukuran string dalam memori (dalam bytes), sedangkan length () mengembalikan jumlah karakter, yang kebetulan bertepatan, karena 1 char = 1 byte?
Boyan Kushlev
4
Tidak. Mereka memiliki fungsi yang sama; mereka bahkan berbagi dokumentasi: en.cppreference.com/w/cpp/string/basic_string/size .
Todd Gamblin
4
Keduanya didefinisikan setara dengan jarak (s.begin (), s.end ()), di mana begin () dan end () adalah iterator atas elemen CharT. CharT adalah parameter templat yang menentukan apa yang ada di string. Untuk std :: string, CharT adalah char. Untuk std :: wstring, CharT adalah wchar_t, yang biasanya 2 atau 4 byte. Bahkan di sana, baik length () dan size () akan mengembalikan jumlah karakter dalam string, BUKAN jumlah byte.
Todd Gamblin
5
Anda harus lupa kadang-kadang orang akan menggunakan std :: string untuk menyimpan string UTF8 . dan utf8 string adalah pengodean panjang variabel , maka Anda tidak dapat menggunakan length () atau size () untuk mendapatkan jumlah karakter string. Sebenarnya mereka hanya mengembalikan hitungan elemen:std::string=> std::bacsic_string<char> count of char std::wstring => std::basic_string<wchar_t> count of wchar_t.
Sheen Tian
16

Ruby sama saja, btw, menawarkan keduanya #length dan #size sebagai sinonim untuk jumlah item dalam array dan hash (C ++ hanya melakukannya untuk string).

Minimalis dan orang-orang yang percaya "seharusnya ada satu, dan idealnya hanya satu, cara yang jelas untuk melakukannya" (seperti yang dibacakan oleh Zen Python), saya kira, sebagian besar setuju dengan keraguan Anda, @Naveen, sementara penggemar Perl's " Ada lebih dari satu cara untuk melakukannya "(atau sintaks SQL dengan bazillion opsional" kata-kata bising "memberikan sekian banyak bentuk sintaksis yang identik untuk mengekspresikan satu konsep) tidak diragukan lagi akan mengeluh bahwa Ruby, dan terutama C ++, hanya saja tidak melangkah terlalu jauh cukup dalam menawarkan redundansi sinonim seperti ;-).

Alex Martelli
sumber
9
Dalam hal ini gratis. Tata bahasa dan penggunaan Perl memungkinkan Anda mengekspresikan hal-hal menggunakan gaya apa pun yang Anda sukai. Memiliki dua kata berbeda untuk hal yang sama hanya membuatnya sulit untuk menemukan istilah pencarian di Stackoverflow.
Adrian Ratnapala
0

Saat menggunakan alat praktik pengkodean (LeetCode) tampaknya ukuran () lebih cepat dari panjang () (meskipun pada dasarnya diabaikan)

Morten
sumber
-10

panjang string == berapa banyak bit yang dimiliki string, ukuran == ukuran bit-bit itu, Dalam string keduanya sama jika editor mengalokasikan ukuran karakter adalah 1 byte

pengguna7817690
sumber
7
jawaban yang salah. Lihat dokumentasi yang ditautkan dalam jawaban yang diterima.
Stefan de Kok