Kendin söyledin, std::dynarray
bir içindir sabit boyutlu dinamik dizide. Yeniden boyutlandırılamaz. Kabaca göre bir gelişme konuşuyor new T[N]
ve üzeri std::unique_ptr<T[]>(new T[N])
.
Kapasiteyi yeniden boyutlandırmaya veya yönetmeye gerek kalmaması, veri yapısını daha az karmaşıklıkla ve daha az alanda uygulayabileceğiniz anlamına gelir.
Dahası, std::dynarray
uygulamanın onu farklı, spesifik olmayan yollarla gerçekleştirmesine izin veren tuhaf bir hayvandır, örneğin diziyi yığına koymak mümkündür. Bir tahsis işlevinin çağrılması "isteğe bağlıdır". Dizinin öğelerini oluşturmak için bir ayırıcı belirtebilirsiniz, ancak bu, türün bir parçası değildir.
Ayrıca neden std::dynarray
ve değişken uzunluklu dizilere ihtiyacımız olduğunu merak edebilirsiniz . C ++ 14'teki VLA'lar çok daha kısıtlayıcıdır; bunlar yalnızca yerel, otomatik değişkenler olabilirler ve bir ayırma politikası belirlemenin hiçbir yolunu sunmazlar ve elbette standart bir konteyner arayüzüne sahip değiller.
23.3.4.2'deki "mevcut taslağın" bazı örnekleri (bunu al, Google önbelleği):
explicit dynarray(size_type c);
Efektler:c
Öğeler için depolama alanı ayırır . Global olanı çağırabilir veya çağırmayabilir operator new
.
template <class Alloc>
dynarray(size_type c, const Alloc& alloc);
Etkiler: Her bir öğenin kullanım ayırıcı yapısıyla oluşturulması dışında önceki kuruculara eşdeğerdir .
Eğer olsun ya da olmasın edebilir dizi elemanlarını oluşturmak için belirli bir ayırıcısı kullandıkları küresel özelliktir:
şablon struct uses_allocator, Alloc>: true_type {};
Gereksinim: Alloc
Bir Dağıtıcı (17.6.3.5) olacaktır. [ Not: Bu özelliğin uzmanlığı, dynarray
yuvalanmış bir ayırıcı türü olmasa bile bir ayırıcıyla oluşturulabilen diğer kitaplık bileşenlerini bilgilendirir .]
Düzenleme: Jonathan Wakely'nin cevabı çok daha yetkili ve anlayışlı olacaktır.