@einpoklum bir şey tanıtılması oldukça iyi bir iş yapar spanolduğunu burada onun cevabını . Bununla birlikte, cevabını okuduktan sonra bile, yeni birisinin hala tam olarak cevaplanmayan bir dizi düşünce akışı sorusuna sahip olması kolaydır, örneğin:
- Bir Nasıl
spanbir C diziden farklı? Neden sadece bunlardan birini kullanmıyorsunuz? Görünüşe göre boyutu da bilinenlerden biri ...
- Bekle, bu kulağa benziyor
std::array, bundan nasıl spanfarklı?
- Ah, beni hatırlatan bir değil
std::vectorbir benzeri std::arrayde?
- Kafam çok karışık. :( Nedir
span?
İşte, bununla ilgili bazı ek netlik:
HIS CEVAP DOĞRUDAN QUOTE - İLE MY EKLENEN İÇİNDE KALIN :
Bu ne?
A span<T>:
TBellekte bir yerde bitişik değerler dizisinin çok hafif bir soyutlaması .
- Temel olarak bir grup kolaylık yöntemi ile tek bir yapı
{ T * ptr; std::size_t length; }. (Not Bu belirgin şekilde farklı olan std::array<>bir çünkü spanyöntemlerin erişimci kolaylık, karşılaştırılabilir sağlayan std::arraybir cihaz aracılığıyla, yazmak için işaretçiT ve tip uzunluğu (elementlerin sayısı) Tise, std::arraybir ya da daha fazlasına sahip bir gerçek bir kaptır değerleri Çeşidi T.)
- Sahip olmayan bir tür (yani, " değer türü" yerine "başvuru türü"): Hiçbir zaman hiçbir şey ayırmaz veya dağıtmaz ve akıllı işaretçileri canlı tutmaz.
Eskiden array_viewve daha önce de biliniyordu array_ref.
Bu cesur parçalar kişinin anlayışı için kritik öneme sahiptir, bu yüzden onları kaçırmayın veya yanlış okumayın! A spanbir C-dizisi dizisi DEĞİLDİR, ne de bir C-dizisi tipi Tartı dizinin uzunluğu (bu esasen std::array kabın ne olacağıdır), NOR işaretçilerden oluşan C-dizisidir türüne Tartı uzunluğu, bunun yerine a, tek tek içeren yapı tipine işaretçiT ve uzunluğu olan, (tip elemanların sayısı Tişaretçi yazmak için bu bitişik bellek bloğunda) Tiçin puan! Bu şekilde, bir eklentispanişaretçiyi ve uzunluğu saklamak için değişkenler ve kullandığınız kolaylık erişimci işlevleri spansağlar.
Bu AKSİNE bir olduğunu std::array<>, çünkü std::array<>tüm bitişik blok için aslında ayırır bellek ve AKSİNE olan std::vector<>bir nedeni std::vectortemelde sadece std::arrayayrıca yaptığı dinamik büyüyen her seferinde doldurur (genelde boyut olarak iki katına) ve ona başka bir şey eklemeye çalıştığınızda . A std::arrayboyutu sabittir ve a spanişaret ettiği bloğun belleğini bile yönetmez, sadece bellek bloğunu gösterir, bellek bloğunun ne kadar uzun olduğunu bilir, bir C-dizisinde hangi veri türünün olduğunu bilir ve bitişik bellekteki öğelerle çalışmak için kolaylık erişimci işlevleri sağlar .
Bu ise C parçası ++ standardı:
std::spanC ++ 20'den itibaren C ++ standardının bir parçasıdır. Belgelerini buradan okuyabilirsiniz: https://en.cppreference.com/w/cpp/container/span . Google'ın bugünabsl::Span<T>(array, length) C ++ 11 veya sonraki sürümlerinde nasıl kullanılacağını görmek için aşağıya bakın.
Özet Açıklamalar ve Temel Referanslar:
std::span<T, Extent>( Extent= "sekanstaki öğe sayısı veya std::dynamic_extentdinamikse". Bir yayılma alanı yalnızca belleğe işaret eder ve erişimi kolaylaştırır, ancak yönetmez!):
- https://en.cppreference.com/w/cpp/container/span
std::array<T, N>( sabit bir boyuta sahip olduğuna dikkat edin N!):
- https://en.cppreference.com/w/cpp/container/array
- http://www.cplusplus.com/reference/array/array/
std::vector<T> (otomatik olarak gerektiğinde otomatik olarak boyut olarak büyür):
- https://en.cppreference.com/w/cpp/container/vector
- http://www.cplusplus.com/reference/vector/vector/
Nasıl Can I Kullanım spanC ++ 11 veya daha sonra bugün ?
Google, dahili C ++ 11 kitaplıklarını "Abseil" kitaplıkları biçiminde açık kaynaklı hale getirmiştir. Bu kütüphane, yarının özelliklerini bugün kullanabilmeniz için, C ++ 11 ve sonraki sürümlerinde çalışan C ++ 14'ten C ++ 20'ye ve ötesine özellikler sağlamayı amaçlamaktadır. Onlar söylüyor:
C ++ Standardı ile uyumluluk
Google, C ++ 14, C ++ 17 ve ötesinde bulunan özelliklerle eşleşen veya bunlarla yakından eşleşen birçok soyutlama geliştirmiştir. Bu soyutlamaların Abseil sürümlerini kullanmak, kodunuz henüz bir C ++ 11 dünyasında yaşam için hazır olmasa bile, şimdi bu özelliklere erişmenizi sağlar.
İşte bazı önemli kaynaklar ve bağlantılar:
- Ana site: https://abseil.io/
- https://abseil.io/docs/cpp/
- GitHub deposu: https://github.com/abseil/abseil-cpp
span.hüstbilgi ve absl::Span<T>(array, length)şablon sınıfı: https://github.com/abseil/abseil-cpp/blob/master/absl/types/span.h#L189
std::spanC ++ 17 veya C ++ 20 için geçerlidir. Ayrıca bkz. P0122R5, span: nesnelerin dizileri için güvenli sınırlar . Bu dili gerçekten hedeflemek istiyor musunuz? Derleyicilerin yetişmesi yıllar alacaktır.