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