Динамические массивы против векторов STL точную разницу?

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

Вопрос:

Какова точная разница между динамическими массивами и векторами. Это был вопрос для меня.

  • Я сказал, что обе имеют последовательную память.

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

  • Я сказал, что векторы свободны от ошибок, так как они находятся в стандартной библиотеке. Он сказал, что предоставит как .so файл динамических массивов, который является безошибочным и обладает всеми качествами наравне с STL.

Я смущен и не ответил на точную разницу. Когда я искал в Интернете, я видел только указанные выше утверждения.

Может кто-нибудь объяснить мне точную разницу? И что ожидал от меня интервьюер?

Ответ №1

Он сказал, что предоставит в качестве .so файла динамических массивов, который без ошибок и обладает всеми качествами наравне с STL.

Если его динамический класс массива делает то же самое, что и std::vector (то есть: он реализует RAII для очистки после себя, может расти и сокращаться, а что бы то ни было std::vector), тогда существует только одно главное преимущество std::vector имеет над своим динамическим классом массив:

std::vector стандартизованный и все это знают. Если я вижу std::vector в некотором фрагменте кода, я точно знаю, что он делает и как он должен использоваться. Если, однако, я вижу a my::dynamic_array, я этого не знаю. Мне нужно будет посмотреть на его документацию или даже – вздохнуть! – реализация, чтобы выяснить, выполняет ли my_dynamic_array::resize() то же самое, что и std::vector::resize().

Ответ №2

Здесь многое зависит от того, что он подразумевает под “динамическим массивом”. Большинство людей означает что-то, где память распределяется с помощью массива-new и освобождается с помощью массива-delete. Если это намерение здесь, то наличие качеств на уровне с std::vector просто невозможно.

Причина довольно проста: std::vector обычно выделяет кусок памяти больше, чем необходимо, чтобы удерживать количество элементов, которые в настоящее время хранятся. Затем он создает объекты в этой памяти по мере необходимости для расширения. Но с новым массивом у вас нет выбора – вы выделяете массив объектов, поэтому, если вы выделите пространство для (скажем) 100 объектов, вы получите 100 объектов, созданных в этом пространстве (сразу). Он просто не имеет резерва для наличия буфера, часть которого содержит реальные объекты, а другая часть – просто простая память, не содержащая ничего.

Я полагаю, что если yo хочет растянуть точку, возможно подражать std::vector и по-прежнему выделять пространство с помощью массива-new. Для этого вам просто нужно выделить массив char, а затем использовать place new для создания объектов в этом необработанном пространстве памяти. Это позволяет почти такие же вещи, как std::vector, потому что это почти то же самое, что и std::vector. Мы по-прежнему не обладаем (потенциальным) уровнем косвенности, хотя – std::vector фактически выделяет память через объект Allocator, поэтому вы можете точно изменить, как он распределяет свою необработанную память (по умолчанию используется std::allocator<T>, который использует operator new, но если бы вы захотели, вы могли бы написать распределитель, который использовал бы new char[size], хотя я не могу себе представить, почему вы бы это сделали.)

Можно, конечно, написать динамический массив, чтобы использовать объект-распределитель. В этот момент для всех практических целей вы только что заново изобрели std::vector под (предположительно) новым именем. В этом случае @sbi по-прежнему прав: сам факт, что он не стандартизован, означает, что он по-прежнему не имеет одного из главных качеств std:::vector – качества стандартизации и уже известного всем, кто знает С++. Однако даже без этого мы должны растянуть выражение “динамический массив” до (и я установил за пределами) точку прерывания, чтобы получить те же качества, что и std::vector, даже если мы игнорируем стандартизацию.

Ответ №3

Я ожидаю, что они хотели, чтобы вы поговорили о ловушках забывания, чтобы удалить динамический массив с удалением оператора [], а затем запутались, когда попытались помочь вам; это не имеет большого смысла для реализации динамического массива как простого класса, поскольку он испекает тип элемента.

Ответ №4

Память массива, выделенная для векторов, освобождается, когда вектор выходит за пределы области действия, в случае, если вектор объявлен в стеке (массив поддержки будет находиться в куче).

void foo() { vector<int> v; // … method body // backing array will be freed here } Ответ №5

Здесь говорится: “Внутри векторы используют динамически выделенный массив для хранения своих элементов”.
Базовое понятие векторов представляет собой динамически распределенный массив.

http://www.cplusplus.com/reference/vector/vector/

Оцените статью
Добавить комментарий