Динамический массив через вектор и указатели

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


Ответы (2 шт):

Автор решения: Ildar

Под динамический массив вам нужно самостоятельно выделять память и освобождать её (проследить все пути выполнения программы чтобы память точно освободилась), также перевыделять её если не умещается нужное количество элементов в массив. Класс предоставляет множество удобных конструкторов, перегруженных операторов, методов и т.д. Слежение за этим всем отвлекает от основной задачи (реализации необходимой программы), самостоятельная реализация этой функциональности займет только лишнее время и на вряд ли будет эффективнее если у вас структура данных не под какую то специфичную задачу.

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

→ Ссылка
Автор решения: Harry

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

Например, вы пишете

оба выделяют память для массива по мере надобности

Увы! Вектор это делает "за сценой", так что вы просто вызываете его push_back(), например, и все. А с массивом? Вы должны отслеживать количество элементов в массиве, размер массива, и если добавлять некуда - то самостоятельно выделять новый массив большего размера, копировать в него элементы из старого, потом удалять их в старом (если они не просто int, а, скажем, объекты класса с нетривиальным деструктором - кстати, именно поэтому простой realloc в общем случае не работает), удалять старый массив, менять указатели... Вы уверены, что все это напишете с полпинка и без ошибок?

Или вас ввело в заблуждение название "динамический массив" и вы считали, что он делает это все сам? На этот случай поясню, что "динамический" в применении к массиву означает лишь, что он создается динамически, во время работы программы, а не статически, при компиляции.

В этом - возможности создания классов, которые все эти мелочи прячут и автоматизируют (а еще и берут на себя корректное уничтожение объектов и освобождение памяти) - заключается одно из огромных преимуществ С++.

→ Ссылка