В чем разница между массивом и вектором в C ++? Примером различий могут быть библиотеки, символика, способности и т. Д.
массив
Массивы содержат определенное количество элементов определенного типа. Чтобы компилятор мог зарезервировать необходимый объем пространства при компиляции программы, вы должны указать тип и количество элементов, которые будет содержать массив при его определении. Компилятор должен иметь возможность определить это значение при компиляции программы. После определения массива вы используете идентификатор массива вместе с индексом для доступа к определенным элементам массива. [...] массивы имеют нулевой индекс; то есть первый элемент имеет индекс 0. Эта схема индексации указывает на тесную взаимосвязь в C ++ между указателями и массивами и правилами, которые язык определяет для арифметики указателей.
- Карманный справочник C ++
Вектор
Вектор - это последовательность объектов динамического размера, обеспечивающая
operator[]
произвольный доступ в стиле массива . Функция-членpush_back
копирует свои аргументы через конструктор копирования, добавляет эту копию в качестве последнего элемента в векторе и увеличивает ее размер на единицу.pop_back
делает прямо противоположное, удаляя последний элемент. Вставка или удаление элементов с конца вектора требует амортизированного постоянного времени, а вставка или удаление из любого другого места занимает линейное время. Это основы векторов. Есть еще много чего. В большинстве случаев вектор должен быть вашим первым выбором, а не массивом в стиле C. Прежде всего, они имеют динамический размер, что означает, что они могут расти по мере необходимости. Вам не нужно проводить всевозможные исследования, чтобы определить оптимальный статический размер, как в случае массивов C; вектор увеличивается по мере необходимости, и при необходимости его размер можно увеличивать или уменьшать вручную. Во-вторых, векторы предлагают проверку границ с помощьюat
функции-члена (но не с помощьюoperator[]
), чтобы вы могли что-то сделать, если вы ссылаетесь на несуществующий индекс, вместо того, чтобы просто наблюдать за сбоями вашей программы или, что еще хуже, продолжать выполнение с поврежденными данными.- Поваренная книга C ++
Ответы:
массивы:
malloc
);sizeof
(отсюда и распространенная идиомаsizeof(arr)/sizeof(*arr)
, которая, однако, не работает при случайном использовании с указателем);std::vector
:&vec[0]
гарантированно работает должным образом);begin()
/end()
, обычные STLtypedef
, ...)Также рассмотрим «современную альтернативу» массивам -
std::array
; Я уже описал в другом ответе разницу междуstd::vector
иstd::array
, вы можете взглянуть на это.источник
Я добавлю, что массивы - это очень низкоуровневые конструкции в C ++, и вы должны стараться держаться от них как можно дальше при «изучении веревок» - это рекомендует даже Бьярн Страуструп (он разработчик C ++).
Векторы приближаются к той же производительности, что и массивы, но обладают множеством удобств и функций безопасности. Вероятно, вы начнете использовать массивы при взаимодействии с API, которые работают с необработанными массивами, или при создании собственных коллекций.
источник
Эти ссылки в значительной степени ответили на ваш вопрос. Проще говоря, длины векторов являются динамическими, а массивы имеют фиксированный размер. при использовании массива вы указываете его размер при объявлении:
для векторов вы просто объявляете его и добавляете элементы
иногда вы не знаете количество необходимых элементов, поэтому вектор будет идеальным для такой ситуации.
источник