@einpoklum bir şey tanıtılması oldukça iyi bir iş yapar span
olduğ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
span
bir 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 span
farklı?
- Ah, beni hatırlatan bir değil
std::vector
bir benzeri std::array
de?
- 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>
:
T
Bellekte 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ü span
yöntemlerin erişimci kolaylık, karşılaştırılabilir sağlayan std::array
bir cihaz aracılığıyla, yazmak için işaretçiT
ve tip uzunluğu (elementlerin sayısı) T
ise, std::array
bir 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_view
ve 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 span
bir C-dizisi dizisi DEĞİLDİR, ne de bir C-dizisi tipi T
artı dizinin uzunluğu (bu esasen std::array
kabın ne olacağıdır), NOR işaretçilerden oluşan C-dizisidir türüne T
artı uzunluğu, bunun yerine a, tek tek içeren yapı tipine işaretçiT
ve uzunluğu olan, (tip elemanların sayısı T
işaretçi yazmak için bu bitişik bellek bloğunda) T
için puan! Bu şekilde, bir eklentispan
işaretçiyi ve uzunluğu saklamak için değişkenler ve kullandığınız kolaylık erişimci işlevleri span
sağ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::vector
temelde sadece std::array
ayrı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::array
boyutu sabittir ve a span
iş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::span
C ++ 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_extent
dinamikse". 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 span
C ++ 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::span
C ++ 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.