Saya tidak bisa tidak setuju dengan semangat jawaban yang diterima dengan cukup kuat. "Alat pilihan terakhir"? Jauh dari itu!
Cara saya melihatnya, salah satu fitur terkuat dari C ++ dibandingkan dengan C dan beberapa bahasa lain yang serupa adalah kemampuan untuk mengekspresikan kendala sehingga mereka dapat diperiksa pada waktu kompilasi dan penyalahgunaan yang tidak disengaja dapat dicegah. Jadi, ketika merancang struktur, tanyakan pada diri sendiri operasi apa yang harus diizinkan. Semua penggunaan lain harus dilarang, dan yang terbaik adalah jika pembatasan tersebut dapat diimplementasikan secara statis (pada waktu kompilasi) sehingga penyalahgunaan menyebabkan kegagalan kompilasi.
Jadi ketika seseorang membutuhkan sebuah array, jawaban untuk pertanyaan berikut menentukan perilakunya: 1. Apakah ukurannya a) dinamis saat runtime, atau b) statis, tetapi hanya dikenal saat runtime, atau c) statis dan dikenal pada waktu kompilasi? 2. Dapatkah array dialokasikan pada stack atau tidak?
Dan berdasarkan jawaban, inilah yang saya lihat sebagai struktur data terbaik untuk array seperti itu:
Dynamic | Runtime static | Static
Stack std::vector unique_ptr<T[]> std::array
Heap std::vector unique_ptr<T[]> unique_ptr<std::array>
Ya, saya pikir unique_ptr<std::array>
juga harus dipertimbangkan, dan tidak ada alat terakhir. Coba pikirkan apa yang paling cocok dengan algoritma Anda.
Semua ini kompatibel dengan API C sederhana melalui pointer mentah ke array data ( vector.data()
/ array.data()
/ uniquePtr.get()
).
PS Terlepas dari pertimbangan di atas, ada juga satu kepemilikan: std::array
dan std::vector
memiliki semantik nilai (memiliki dukungan asli untuk menyalin dan melewati nilai), sementara unique_ptr<T[]>
hanya dapat dipindahkan (menegakkan kepemilikan tunggal). Entah dapat berguna dalam skenario yang berbeda. Sebaliknya, array statis polos ( int[N]
) dan array dinamis polos ( new int[10]
) tidak menawarkan dan karenanya harus dihindari jika mungkin - yang seharusnya dimungkinkan dalam sebagian besar kasus. Jika itu tidak cukup, array dinamis polos juga tidak menawarkan cara untuk menanyakan ukurannya - peluang tambahan untuk kerusakan memori dan celah keamanan.
std::shared_ptr<T[]>
, tetapi harus ada, dan mungkin akan ada di C ++ 14 jika ada yang bisa repot menulis proposal. Sementara itu, selalu adaboost::shared_array
.