string_view
adalah 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 menjadistring_view
? - Apakah ada poin penting lain yang perlu
string_view
dipertimbangkan?
Jawaban:
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_view
dimaksud adalah satu proposal tersebut; ada yang sebelumnya dipanggilstring_ref
danarray_ref
juga.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.
sumber
reference_wrapper
, bukan?string_view
. (Saya tidak mengatakan bahwa Anda tidak pernah dapat menulis kode yang rusak. Hanya saja kerusakannya adalah lokal .)std::range
dariboost::iterator_range
- IMO itu lebih baik daripada ide string_view