Apa itu string_view?

162

string_viewadalah fitur yang diusulkan dalam C ++ Library Fundamentals TS ( N3921 ) ditambahkan ke C ++ 17

Sejauh yang saya mengerti itu adalah jenis yang mewakili beberapa jenis "konsep" string yang merupakan pandangan dari semua jenis wadah yang dapat menyimpan sesuatu yang dapat dilihat sebagai string.

  • Apakah ini benar ?
  • Haruskah const std::string&tipe parameter kanonik menjadi string_view?
  • Apakah ada poin penting lain yang perlu string_viewdipertimbangkan?
Drax
sumber
4
Akhirnya, seseorang menyadari bahwa string memerlukan semantik yang berbeda, walaupun memperkenalkan string_view hanyalah langkah kecil.
John Z. Li

Jawaban:

183

Tujuan dari segala dan semua jenis proposal "referensi string" dan "referensi array" adalah untuk menghindari menyalin data yang sudah dimiliki di tempat lain dan hanya diperlukan tampilan non-mutasi. The string_viewdimaksud adalah satu proposal tersebut; ada yang sebelumnya dipanggil string_refdan array_refjuga.

Idenya adalah selalu untuk menyimpan sepasang pointer-to-pertama-elemen dan ukuran beberapa ada data array atau tali.

Kelas handle-view seperti itu dapat diedarkan dengan harga murah dan akan menawarkan operasi substring yang murah (yang dapat diimplementasikan sebagai peningkatan pointer sederhana dan penyesuaian ukuran).

Banyak penggunaan string tidak memerlukan kepemilikan string yang sebenarnya, dan string yang dimaksud sering kali sudah dimiliki oleh orang lain. Jadi ada potensi asli untuk meningkatkan efisiensi dengan menghindari salinan yang tidak dibutuhkan (pikirkan semua alokasi dan pengecualian yang dapat Anda simpan).

String C asli mengalami masalah karena terminator nol adalah bagian dari string API, sehingga Anda tidak dapat dengan mudah membuat substring tanpa memutasikan string yang mendasarinya (a la strtok). Dalam C ++, ini mudah diselesaikan dengan menyimpan panjang secara terpisah dan membungkus pointer dan ukuran ke dalam satu kelas.

Satu kendala utama dan perbedaan dari filosofi perpustakaan standar C ++ yang dapat saya pikirkan adalah bahwa kelas "tampilan referensial" memiliki semantik kepemilikan yang sama sekali berbeda dari perpustakaan standar lainnya. Pada dasarnya, semua yang ada di pustaka standar tanpa syarat aman dan benar (jika dikompilasi, itu benar). Dengan kelas referensi seperti ini, itu tidak lagi benar. Kebenaran program Anda tergantung pada kode ambient yang menggunakan kelas-kelas ini. Jadi lebih sulit untuk memeriksa dan mengajar.

Kerrek SB
sumber
19
Kapal itu berlayar dengan filosofi itu reference_wrapper, bukan?
Steve Jessop
5
@ GerrekSB Saya khawatir saya tidak mengikuti. Bisakah Anda memperluas bagian "kelas tampilan referensial tersebut memiliki semantik kepemilikan yang sama sekali berbeda dari bagian perpustakaan standar" , tolong? Tidak jelas bagi saya: Apa bedanya dengan menggantung referensi / petunjuk? Atau iterator tidak valid karena penyisipan (misalnya std :: vector)? Kami sudah memiliki masalah ini, sangat alami bagi saya bahwa pandangan yang tidak memiliki akan memiliki masalah yang sama seperti yang dimiliki oleh pointer / referensi / iterator yang tidak memiliki.
Ali
5
@ Ali: Saat Anda menggunakan wadah pustaka standar lainnya, Anda dapat menegaskan kebenaran kode hanya dengan melihat kode yang menggunakan wadah. Tidak demikian halnya untuk string_view. (Saya tidak mengatakan bahwa Anda tidak pernah dapat menulis kode yang rusak. Hanya saja kerusakannya adalah lokal .)
Kerrek SB
6
Saya terkejut mereka tidak pergi dengan std::rangedari boost::iterator_range- IMO itu lebih baik daripada ide string_view
Charles Salvia
19
@ nwp: Banyak orang dan bahasa telah datang untuk meratapi default C ++ yang mengerikan dan berpikir bahwa "const" dan "unshare" harus menjadi default, dengan "dapat diubah" dan "berbagi" dengan eksplisit, pengecualian langka.
Kerrek SB