std::vector
является шаблоном класса, который инкапсулирует динамический массив 1 , сохраненный в куче, который автоматически увеличивается и уменьшается при добавлении или удалении элементов. Он предоставляет все хуки ( begin()
, end()
итераторы и т. Д.), Которые делают его работоспособным с остальной частью STL. У него также есть несколько полезных методов, которые позволяют вам выполнять операции, которые в обычном массиве будут громоздкими, например, вставлять элементы в середине вектора (он выполняет всю работу по перемещению следующих элементов за кулисами).
Поскольку он хранит элементы в памяти, выделенной в куче, он имеет некоторые накладные расходы в отношении статических массивов.
std::array
это шаблонный класс, который инкапсулирует массив статического размера, хранящийся внутри самого объекта, что означает, что, если вы создадите экземпляр класса в стеке, сам массив будет в стеке. Его размер должен быть известен во время компиляции (он передается как параметр шаблона), и он не может увеличиваться или уменьшаться.
Он более ограничен std::vector
, но часто более эффективен, особенно для небольших размеров, потому что на практике это в основном облегченная оболочка вокруг массива в стиле C. Однако он более безопасен, поскольку неявное преобразование в указатель отключено и обеспечивает большую часть функций, связанных с STL, std::vector
и других контейнеров, поэтому его можно легко использовать с алгоритмами STL & co. Во всяком случае, для самого ограничения фиксированного размера это гораздо менее гибко, чем std::vector
.
Для ознакомления std::array
посмотрите эту статью ; для быстрого ознакомления с std::vector
операциями, которые возможны на нем, вы можете посмотреть его документацию .
На самом деле, я думаю, что в стандарте они описаны с точки зрения максимальной сложности различных операций (например, произвольный доступ в постоянное время, итерация по всем элементам в линейное время, добавление и удаление элементов в конце в постоянное амортизированное время, и т.д.), но у AFAIK нет другого метода выполнения таких требований, кроме использования динамического массива. Как утверждает @Lucretiel, стандарт фактически требует, чтобы элементы хранились непрерывно, поэтому это динамический массив, хранящийся там, где его размещает связанный распределитель.
std::vector
противstd::array
и как термины отличаются.