Каковы различия между массивом и вектором в C ++? Примером различий могут быть библиотеки, символика, способности и т. Д.

массив

Массивы содержат определенное количество элементов определенного типа. Чтобы компилятор мог зарезервировать необходимый объем пространства при компиляции программы, вы должны указать тип и количество элементов, которые будет содержать массив при его определении. Компилятор должен уметь определять это значение при компиляции программы. Как только массив был определен, вы используете идентификатор для массива вместе с индексом для доступа к определенным элементам массива. […] массивы с нулевой индексацией; то есть первый элемент имеет индекс 0. Эта схема индексации указывает на тесную связь в C ++ между указателями и массивами и правилами, которые язык определяет для арифметики указателей.

Вектор

Вектор представляет собой последовательность объектов динамического размера, которая обеспечивает стиль массива operator[] произвольный доступ. Функция-член push_back копирует свои аргументы через конструктор копирования, добавляет эту копию как последний элемент в векторе и увеличивает его размер на единицу. pop_back делает прямо противоположное, удаляя последний элемент. Для вставки или удаления элементов в конце вектора требуется амортизированное постоянное время, а для вставки или удаления из любого другого места требуется линейное время. Это основы векторов. Их намного больше. В большинстве случаев вектор должен быть вашим первым выбором по сравнению с массивом в стиле C. Прежде всего, они имеют динамический размер, что означает, что они могут расти по мере необходимости. Вам не нужно проводить всевозможные исследования, чтобы определить оптимальный статический размер, как в случае массивов C; вектор увеличивается по мере необходимости, и его размер можно изменить вручную, увеличив или уменьшив его вручную. Во-вторых, векторы предлагают проверку границ с помощью at функция-член (но не с operator[] ), так что вы можете сделать что-то, если вы ссылаетесь на несуществующий индекс, а не просто наблюдаете сбой вашей программы или еще хуже, продолжая выполнение с поврежденными данными.

Решение

  • являются встроенной языковой конструкцией;
  • приходят почти без изменений от C89;
  • предоставить только непрерывную, индексируемую последовательность элементов; никаких наворотов;
  • имеют фиксированный размер; Вы не можете изменить размер массива в C ++ (если это не массив POD и он не выделен malloc );
  • их размер должен быть константой времени компиляции, если они не размещены динамически;
  • они занимают место для хранения в зависимости от области, в которой вы их объявляете;
  • если динамически распределяется, вы должны явно освободить их;
  • если они расположены динамически, вы просто получаете указатель и не можете определить их размер; в противном случае вы можете использовать sizeof (отсюда общая идиома sizeof(arr)/sizeof(*arr) , однако, молча терпит неудачу при непреднамеренном использовании на указателе);
  • автоматически распадается на указатели в большинстве ситуаций; в частности, это происходит при передаче их функции, которая обычно требует передачи отдельного параметра для их размера;
  • не может быть возвращено из функции;
  • не может быть скопирован / назначен напрямую;
  • динамические массивы объектов требуют конструктора по умолчанию, так как все их элементы должны быть построены первыми;
  • шаблонный класс;
  • является конструкцией только для C ++;
  • реализован в виде динамический массив;
  • динамически растет и сжимается;
  • автоматически управлять своей памятью, которая освобождается при уничтожении;
  • могут быть переданы / возвращены из функций (по значению);
  • может быть скопировано / назначено (это выполняет глубокое копирование всех сохраненных элементов);
  • не разлагается на указатели, но вы Можно явно получить указатель на свои данные ( &vec[0] гарантированно работает как положено);
  • всегда приносит с собой внутренний динамический массив размер (сколько элементов хранится в данный момент) и вместимость (сколько элементов можно хранить в выделенном в данный момент блоке);
  • внутренний динамический массив не распределяется внутри самого объекта (который просто содержит несколько полей «бухгалтерского учета»), но динамически распределяется распределителем, указанным в соответствующем параметре шаблона; по умолчанию память извлекается из свободного хранилища (так называемая куча) независимо от того, где размещен реальный объект;
  • по этой причине они могут быть менее эффективными, чем «обычные» массивы для небольших кратковременных локальных массивов;
  • при перераспределении объекты скопированный (перенесено в C ++ 11);
  • не требует конструктора по умолчанию для сохраняемых объектов;
  • лучше интегрируется с остальными так называемыми STL (это обеспечивает begin() / end() методы, обычный STL typedef с …)

Также рассмотрим «современную альтернативу» массивам — std::array ; Я уже описал в другой ответ разница между std::vector а также std::array Вы можете посмотреть на это.

Другие решения

Я добавлю, что массивы — это очень низкоуровневые конструкции в C ++, и вы должны стараться как можно больше избегать их при «изучении веревок» — даже Бьярне Страуструп рекомендует это (он разработчик C ++).

Векторы очень похожи на те же характеристики, что и массивы, но обладают множеством удобств и функций безопасности. Вы, вероятно, начнете использовать массивы при взаимодействии с API, которые имеют дело с необработанными массивами, или при создании собственных коллекций.

Эти ссылки в значительной степени ответили на ваш вопрос. Проще говоря, длины векторов являются динамическими, в то время как массивы имеют фиксированный размер.
при использовании массива вы указываете его размер при объявлении:

для векторов, вы просто объявляете это и добавляете элементы

иногда вы не знаете, сколько элементов нужно, чтобы вектор был идеальным для такой ситуации.

Мы уже обсуждали массивы и векторы . В этом посте мы обсудим преимущества вектора перед обычным массивом.

Преимущества Vector над массивами :

  1. Vector является шаблоном класса и является конструкцией только для C ++, тогда как массивы являются встроенной языковой конструкцией и представлены как в C, так и в C ++.
  2. Вектор реализован в виде динамических массивов с интерфейсом списка, тогда как массивы могут быть реализованы как статически или динамически с интерфейсом примитивного типа данных.

64 Trancot [2013-02-26 03:14:00]

В чем разница между массивом и вектором в С++? Примером различий могут быть включены библиотеки, символизм, способности и т.д.

Массив

Массивы содержат определенное количество элементов определенного типа. Чтобы компилятор мог зарезервировать требуемое пространство при компиляции программы, вы должны указать тип и количество элементов, которые будет содержать массив, когда он будет определен. Компилятор должен иметь возможность определить это значение при компиляции программы. Как только массив определен, вы используете идентификатор для массива вместе с индексом для доступа к определенным элементам массива. [. ] массивы нуль-индексируются; то есть первый элемент находится в индексе 0. Эта схема индексирования указывает на тесную связь в С++ между указателями и массивами и правилами, которые язык определяет для арифметики указателя.

— Справочник по С++ Pocket

Vector

Вектор представляет собой последовательность объектов с динамическим размером, которая обеспечивает произвольный доступ к массиву operator[] . Функция-член push_back копирует свои аргументы с помощью конструктора копирования, добавляет, что копия как последний элемент в векторе и увеличивает его размер на единицу. pop_back делает обратное, удаляя последний элемент. Вставка или удаление элементов с конца вектора берет амортизированное постоянное время, а вставка или удаление из любого другого места занимает линейное время. Это основы векторов. Их гораздо больше. В большинстве случаев вектор должен быть вашим первым выбором в массиве C-стиля. Прежде всего, они имеют динамический размер, что означает, что они могут расти по мере необходимости. Вам не нужно делать всевозможные исследования, чтобы определить оптимальный статический размер, как в случае с массивами C; вектор растет по мере необходимости, и он может быть изменен более или менее вручную, если вам нужно. Во-вторых, векторы предлагают проверку границ с помощью функции-члена at (но не с operator[] ), так что вы можете что-то сделать, если ссылаетесь на несуществующий индекс, а не просто наблюдаете за сбоем в работе программы или хуже, продолжая выполнение с поврежденными данными.

c++ arrays vector

3 ответа

84 Решение Matteo Italia [2013-02-26 03:55:00]

  • — встроенная языковая конструкция;
  • почти не изменен с C89;
  • обеспечивают только последовательную, индексируемую последовательность элементов; нет звонков и свистов;
  • имеют фиксированный размер; вы не можете изменять размер массива в С++ (если только это не массив POD и он выделяется с помощью malloc );
  • их размер должен быть константой времени компиляции, если они не распределены динамически;
  • они берут свое пространство для хранения в зависимости от области, в которой вы их объявляете;
  • если динамически распределено, вы должны явно освободить их;
  • если они динамически распределены, вы просто получаете указатель, и вы не можете определить их размер; в противном случае вы можете использовать sizeof (отсюда общая идиома sizeof(arr)/sizeof(*arr) , которая, однако, не работает без предупреждения, когда она случайно используется на указателе);
  • автоматически распадается на указатели в большинстве ситуаций; в частности, это происходит при передаче их функции, которая обычно требует передачи отдельного параметра для их размера;
  • не может быть возвращен из функции;
  • нельзя скопировать/назначить напрямую;
  • динамические массивы объектов требуют конструктора по умолчанию, поскольку сначала должны быть построены все их элементы;
  • — это шаблонный класс;
  • является только конструкцией С++;
  • реализуется как динамический массив;
  • растет и сжимается динамически;
  • автоматически управляет своей памятью, которая освобождается от уничтожения;
  • может быть передан/возвращен из функций (по значению);
  • может быть скопирован/назначен (это выполняет глубокую копию всех сохраненных элементов);
  • не распадается на указатели, но вы можете явно получить указатель на свои данные ( &vec[0] гарантированно работает как ожидалось);
  • всегда сочетает в себе внутренний динамический массив с его размером (количество элементов в настоящее время хранится) и емкость (сколько элементов может быть сохранено в текущем выделенном блоке);
  • внутренний динамический массив не выделяется внутри самого объекта (который содержит только несколько полей "бухгалтерии" ), но динамически распределяется распределителем, указанным в соответствующем параметре шаблона; по умолчанию получает память из freestore (так называемая куча), независимо от того, как распределяется фактический объект;
  • по этой причине они могут быть менее эффективными, чем "регулярные" массивы для небольших, короткоживущих локальных массивов;
  • при перераспределении объекты копируются (перемещаются в С++ 11);
  • не требует конструктора по умолчанию для сохраняемых объектов;
  • лучше интегрируется с остальной частью так называемого STL (он предоставляет методы begin() / end() , обычный STL typedef s. )

Также рассмотрим "современную альтернативу" массивам — std::array ; Я уже описал в еще один ответ разницу между std::vector и std::array , вы можете посмотреть на него.

Я добавлю, что массивы — это очень низкоуровневые конструкции на С++, и вы должны стараться держаться подальше от них как можно больше, когда "изучаете веревки" — даже Бьярне Страуступ рекомендует это (он дизайнер С++),

Векторы очень близки к тем же характеристикам, что и массивы, но с большим количеством удобств и функций безопасности. Вероятно, вы начнете использовать массивы при взаимодействии с API, которые имеют дело с необработанными массивами или при создании собственных коллекций.

Эта рекомендация в значительной степени ответила на ваш вопрос. Проще говоря, длины векторов являются динамическими, а массивы имеют фиксированный размер. при использовании массива вы определяете его размер после объявления:

для векторов, вы просто объявляете его и добавляете элементы

время от времени вы не будете знать количество необходимых элементов, чтобы вектор был идеальным для такой ситуации.