Я не могу не согласиться с духом принятого ответа достаточно сильно. «Инструмент последней инстанции»? Отнюдь не!
На мой взгляд, одна из самых сильных возможностей C ++ по сравнению с C и некоторыми другими подобными языками - это способность выражать ограничения, чтобы их можно было проверять во время компиляции и предотвратить случайное неправильное использование. Поэтому при проектировании структуры спросите себя, какие операции она должна разрешать. Все другие виды использования должны быть запрещены, и лучше всего, если такие ограничения могут быть реализованы статически (во время компиляции), чтобы неправильное использование приводило к ошибке компиляции.
Поэтому, когда нужен массив, ответы на следующие вопросы определяют его поведение: 1. Является ли его размер a) динамическим во время выполнения, или b) статическим, но известным только во время выполнения, или c) статичным и известным во время компиляции? 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 C через необработанный указатель на массив данных ( vector.data()
/ array.data()
/ uniquePtr.get()
).
PS Помимо вышеизложенных соображений, есть и право собственности: std::array
и они std::vector
имеют семантику значения (имеют встроенную поддержку копирования и передачи по значению), но unique_ptr<T[]>
могут быть перемещены только (обеспечивает единоличное владение). Любой может быть полезен в различных сценариях. Напротив, простые статические массивы ( int[N]
) и простые динамические массивы ( new int[10]
) не предлагают ни одного, и поэтому их следует избегать, если это возможно, - что должно быть возможно в подавляющем большинстве случаев. Если этого было недостаточно, обычные динамические массивы также не дают возможности запрашивать их размер - дополнительная возможность для повреждений памяти и дыр в безопасности.
std::shared_ptr<T[]>
, но должно быть, и, вероятно, будет в C ++ 14, если кто-то может быть обеспокоен, чтобы написать предложение. В то же время, всегда естьboost::shared_array
.