Реализация std::vector
немного изменилась с C ++ 0x и позже с введением семантики перемещения (см. Что такое семантика перемещения? для ознакомления).
При добавленииэлемент в std::vector
, который уже заполнен, а затем vector
изменяется, что включает в себя процедуру выделения новой, большей области памяти, перемещения существующих данных в новый vector
, удаления старого пространства vector
,и затем добавление нового элемента.
std::vector
- это класс коллекции в стандартной библиотеке шаблонов.Помещение объектов в vector
, удаление их или vector
, выполняющее изменение размера, когда элемент добавляется к полному vector
, требует, чтобы класс объекта поддерживал оператор присваивания, конструктор копирования и перемещениесемантика.(См. требования к типу для std :: vector , а также std :: vector работает с классами, которые не являются конструктивными по умолчанию? для получения подробной информации.)
Один способstd::vector
воспринимается как стиль C array
смежных элементов типа, указанного при определении vector
, который имеет некоторые дополнительные функции для интеграции его в предложения Стандартной библиотеки шаблонов.Что отличает vector
от стандартного array
, так это то, что vector
будет динамически расти при добавлении элементов.(См. std :: vector и c-style , а также Когда бы вы использовали массив вместо вектора / строки? для некоторого обсуждения различий.)
Использование std::vector
позволяет использовать другие компоненты стандартной библиотеки шаблонов, такие как алгоритмы, поэтому использование std::vector
дает ряд преимуществ по сравнению со стилем C array
, поскольку вы можете использовать уже существующие функции.
Вы можете указать начальный размер, если максимум известен заранее.(См. Установка элементов и начальная емкость std :: vector , а также Выбор между vector :: resize () и vector :: reserve () )
Основы std::vector
физического представления представляют собой набор указателей, использующих память, выделенную из кучи.Эти указатели позволяют выполнять фактические операции для доступа к элементам, хранящимся в vector
, удаления элементов из vector
, итерации по vector
, определения количества элементов, определения его размера и т. Д.
Поскольку физическое представление представляет собой непрерывную память, удаление элементов может привести к перемещению оставшихся элементов, чтобы закрыть любые дыры, созданные операцией удаления.
В современной семантике перемещения C ++ накладные расходы на std::vector
были сокращены, напримерчто это, как правило, контейнер по умолчанию, который будет использоваться для большинства приложений, как рекомендовал Бьярн Страуструп в своей книге «Язык программирования C ++, 4-е издание», в которой обсуждается C ++ 11.