Я не можу досить сильно погодитися з духом прийнятої відповіді. "Інструмент останньої інстанції"? Далеко від цього!
Як я бачу, однією з найсильніших особливостей C ++ порівняно з C та деякими іншими подібними мовами є здатність виражати обмеження, щоб їх можна було перевірити під час компіляції та запобігти випадковому використанню. Тому проектуючи структуру, запитайте себе, які операції вона повинна дозволяти. Усі інші використання повинні бути заборонені, і найкраще, якщо такі обмеження можуть бути застосовані статично (під час компіляції), щоб неправильне використання призвело до помилки компіляції.
Отже, коли потрібен масив, відповіді на наступні запитання визначають його поведінку: 1. Чи є його розмір а) динамічним під час виконання, або б) статичним, але відомим лише під час виконання, або с) статичним і відомим під час компіляції? 2. Чи можна виділити масив на стек чи ні?
І виходячи з відповідей, це те, що я вважаю найкращою структурою даних для такого масиву:
Dynamic | Runtime static | Static
Stack std::vector unique_ptr<T[]> std::array
Heap std::vector unique_ptr<T[]> unique_ptr<std::array>
Так, я думаю, що unique_ptr<std::array>
це також слід враховувати, і це не є інструментом останньої інстанції. Подумайте, що найкраще відповідає вашому алгоритму.
Усі вони сумісні з звичайними API API через необроблений вказівник на масив даних ( vector.data()
/ array.data()
/ uniquePtr.get()
).
PS Окрім вищезазначених міркувань, є також одна власність: std::array
і std::vector
мають значення семантики (мають нативну підтримку копіювання та передачі за значенням),unique_ptr<T[]>
їх можна переміщувати лише (застосовує єдине право власності). Будь-яке може бути корисним у різних сценаріях. Навпаки, звичайні статичні масиви ( int[N]
) та прості динамічні масиви ( new int[10]
) не пропонують жодного, і, таким чином, не слід уникати, якщо це можливо - що має бути можливим у переважній більшості випадків. Якщо цього було недостатньо, звичайні динамічні масиви також не дають можливості запитувати їх розмір - додаткова можливість для пошкодження пам'яті та отворів у безпеці.
std::shared_ptr<T[]>
, але має бути, і, мабуть, це буде в С ++ 14, якщо хтось може потурбуватися написати пропозицію. Тим часом завжди єboost::shared_array
.