@einpoklum melakukan pekerjaan yang cukup baik untuk memperkenalkan apa yang spanada dalam jawabannya di sini . Namun, bahkan setelah membaca jawabannya, mudah bagi orang baru untuk melakukan rentang untuk masih memiliki serangkaian pertanyaan yang tidak terjawab sepenuhnya, seperti berikut:
- Bagaimana
spanperbedaan dari array C? Mengapa tidak menggunakan salah satunya saja? Sepertinya itu hanya salah satu dari mereka dengan ukuran yang dikenal juga ...
- Tunggu, itu terdengar seperti
std::array, bagaimana spanbedanya dengan itu?
- Oh, itu mengingatkan saya, bukankah itu
std::vectorseperti std::arrayjuga?
- Aku begitu bingung. :( Apa itu
span?
Jadi, inilah beberapa kejelasan tambahan tentang itu:
KUTIPAN LANGSUNG DARI JAWABANNYA - DENGAN TAMBAHAN SAYA DALAM BOLD :
Apa itu?
A span<T>adalah:
- Abstraksi yang sangat ringan dari urutan nilai-nilai tipe yang berdekatan
Tdi memori.
- Pada dasarnya sebuah struct tunggal
{ T * ptr; std::size_t length; } dengan banyak metode kenyamanan. (Perhatikan ini jelas berbeda dari std::array<>karena spanmemungkinkan metode aksesor kenyamanan, sebanding dengan std::array, melalui pointer ke jenisT dan panjang (jumlah elemen) dari jenis T, sedangkan std::arraywadah aktual yang memegang satu atau lebih nilai - nilai jenisT .)
- Tipe yang tidak memiliki (yaitu "tipe referensi" dan bukan "tipe nilai"): Tipe ini tidak pernah mengalokasikan atau membatalkan alokasi apa pun dan tidak membuat pointer pintar tetap hidup.
Sebelumnya dikenal sebagai array_viewdan bahkan sebelumnya sebagaiarray_ref .
Bagian yang berani itu penting untuk pemahaman seseorang, jadi jangan sampai ketinggalan atau salah baca! A spanBUKAN C-array struct, juga bukan merupakan struct dari C-array tipe Tplus panjang array (ini akan menjadi dasarnya std::array wadah ), NOR apakah itu bukan C-array struct dari pointer untuk mengetik Tplus panjang, tetapi lebih merupakan struktur tunggal yang berisi satu pointerT tunggal untuk mengetik , dan panjangnya , yang merupakan jumlah elemen (tipe T) di blok memori yang berdekatan dimana pointer untuk mengetik Tpoin ke! Dengan cara ini, satu-satunya overhead yang telah Anda tambahkan dengan menggunakan aspanadalah variabel untuk menyimpan pointer dan panjang, dan fungsi aksesor kenyamanan yang Anda gunakanspan menyediakan.
Ini adalah UNLIKE std::array<>karena std::array<>sebenarnya mengalokasikan memori untuk seluruh blok yang bersebelahan, dan itu UNLIKE std::vector<>karena a std::vectorpada dasarnya hanya std::arrayyang juga tumbuh dinamis (biasanya dua kali lipat) setiap kali mengisi dan Anda mencoba menambahkan sesuatu yang lain ke dalamnya . Sebuah std::arrayadalah tetap dalam ukuran, dan sebuah spanbahkan tidak mengelola memori dari blok itu menunjuk, itu hanya poin ke blok memori, yang tahu berapa lama blok memori, tahu apa tipe data dalam C-array dalam memori, dan memberikan kemudahan akses atau fungsi untuk bekerja dengan elemen-elemen dalam memori yang berdekatan .
Ini adalah bagian dari standar C ++:
std::spanadalah bagian dari standar C ++ pada C ++ 20. Anda dapat membaca dokumentasinya di sini: https://en.cppreference.com/w/cpp/container/span . Untuk melihat cara menggunakan Google absl::Span<T>(array, length)di C ++ 11 atau lebih baru hari ini , lihat di bawah.
Deskripsi Ringkasan, dan Referensi Kunci:
std::span<T, Extent>( Extent= "jumlah elemen dalam urutan, atau std::dynamic_extentjika dinamis". Rentang hanya menunjuk ke memori dan membuatnya mudah diakses, tetapi TIDAK mengelolanya!):
- https://en.cppreference.com/w/cpp/container/span
std::array<T, N>(perhatikan ukurannya tetapN !):
- https://en.cppreference.com/w/cpp/container/array
- http://www.cplusplus.com/reference/array/array/
std::vector<T> (secara otomatis tumbuh dalam ukuran sesuai kebutuhan):
- https://en.cppreference.com/w/cpp/container/vector
- http://www.cplusplus.com/reference/vector/vector/
Bagaimana Saya Dapat Menggunakan spanC ++ 11 atau lebih baru hari ini ?
Google telah membuka sumber pustaka C ++ 11 internal mereka dalam bentuk pustaka "Abseil" mereka. Pustaka ini dimaksudkan untuk menyediakan C ++ 14 hingga C ++ 20 dan di luar fitur yang berfungsi di C ++ 11 dan yang lebih baru, sehingga Anda dapat menggunakan fitur besok, hari ini. Mereka bilang:
Kompatibilitas dengan Standar C ++
Google telah mengembangkan banyak abstraksi yang cocok atau cocok dengan fitur yang dimasukkan ke dalam C ++ 14, C ++ 17, dan seterusnya. Menggunakan versi Abseil dari abstraksi ini memungkinkan Anda untuk mengakses fitur-fitur ini sekarang, bahkan jika kode Anda belum siap untuk digunakan di dunia postingan C ++ 11.
Berikut beberapa sumber dan tautan utama:
- Situs utama: https://abseil.io/
- https://abseil.io/docs/cpp/
- Repositori GitHub: https://github.com/abseil/abseil-cpp
span.hheader, dan absl::Span<T>(array, length)kelas templat: https://github.com/abseil/abseil-cpp/blob/master/absl/types/span.h#L189
std::spandiusulkan pada 2017. Ini berlaku untuk C ++ 17 atau C ++ 20. Juga lihat P0122R5, span: bounds-safe views untuk urutan objek . Apakah Anda benar-benar ingin menargetkan bahasa itu? Ini akan menjadi tahun sebelum kompiler mengejar ketinggalan.