Kabul edilen cevabın ruhuna yeterince katılmıyorum. "Son çare aracı" mı? Ne münasebet!
Gördüğüm gibi, C ++ 'nın C ve diğer benzer dillere kıyasla en güçlü özelliklerinden biri, derlemeleri zamanında kontrol edebilmeleri ve yanlışlıkla kötüye kullanımı önleyebilmeleri için kısıtlamaları ifade edebilme yeteneğidir. Bu yüzden bir yapı tasarlarken kendinize hangi işlemlere izin vermesi gerektiğini sorun. Diğer tüm kullanımlar yasaklanmalıdır ve bu tür kısıtlamaların statik olarak (derleme zamanında) uygulanabilmesi en iyisidir, böylece yanlış kullanım bir derleme hatasına neden olur.
Yani bir diziye ihtiyaç duyulduğunda, aşağıdaki soruların cevapları davranışını belirtir: 1. a) çalışma zamanında dinamik mi, yoksa b) statik mi, ancak yalnızca çalışma zamanında mı biliniyor, yoksa c) statik mi ve derleme zamanında mı biliniyor? 2. Dizi yığına ayrılabilir mi, atanamaz mı?
Ve cevaplara dayanarak, böyle bir dizi için en iyi veri yapısı olarak gördüğüm budur:
Dynamic | Runtime static | Static
Stack std::vector unique_ptr<T[]> std::array
Heap std::vector unique_ptr<T[]> unique_ptr<std::array>
Evet, bence unique_ptr<std::array>
de düşünülmeli ve ikisi de son çare değil. Sadece algoritmanıza en uygun olanı düşünün.
Bunların tümü, ham işaretçi-veri dizisi ( vector.data()
/ array.data()
/ uniquePtr.get()
) aracılığıyla düz C API'leri ile uyumludur .
PS Yukarıdaki hususların yanı sıra, sahipliklerden biri de vardır: std::array
ve std::vector
değer semantiğine sahip olmak (değere göre kopyalama ve değere geçmek için yerel desteğe sahip olmak), ancak unique_ptr<T[]>
yalnızca hareket ettirilebilir (tek mülkiyeti zorlar). Her ikisi de farklı senaryolarda yararlı olabilir. Aksine, düz statik diziler ( int[N]
) ve düz dinamik diziler ( new int[10]
) hiçbiri sunmaz ve bu nedenle mümkünse kaçınılmalıdır - bu, vakaların büyük çoğunluğunda mümkün olmalıdır. Bu yeterli değilse, düz dinamik diziler de boyutlarını sorgulamanın bir yolunu sunmaz - bellek bozulmaları ve güvenlik delikleri için ekstra fırsat.
std::shared_ptr<T[]>
olmadığına dikkat etmeliyim, ama olmalı ve muhtemelen bir teklif yazmak için rahatsız edilebilecekse C ++ 14'te olacaktır. Bu arada, her zaman vardırboost::shared_array
.