Некоторые вопросы о Векторе в STL

У меня есть некоторые вопросы о векторе в STL для разъяснения.....

  1. Где объекты в векторе выделены? "куча"?

  2. вектор имеет граничную проверку? Если индекс из границы, какая ошибка произойдет?

  3. Почему массив быстрее, чем вектор?

  4. Есть ли какой-либо случай, в котором вектор не применим, но массив - необходимость?

5
задан sth 21 March 2010 в 21:35
поделиться

5 ответов

  1. В непрерывном блоке памяти в куче. vector распределяет память так же, как new int [x] .
  2. Только если вы используете метод at . Он генерирует исключение std :: out_of_range , если проверка границ завершается неудачно. Оператор [] не выполняет проверку границ.
  3. Поскольку массив предоставляет прямой доступ к памяти, при доступе к элементу вектора, скорее всего, требуется вызов метода. Однако разница может быть смехотворно маленькой, особенно если ваш компилятор решит встроить вызовы.
  4. В общем, вы будете использовать вектор , если хотите, чтобы ваш контейнер имел динамический размер, и простой массив, если известного фиксированного размера достаточно. Не забудьте проверить другие контейнеры, например deque и list , чтобы убедиться, что вы выбрали наиболее подходящий. В противном случае, если вам нужно иметь дело с API, отличными от C ++, вам, очевидно, потребуется доступ к обычному массиву. (править) @BillyONeal говорит, что вы должны использовать & vector [0] , чтобы получить адрес базового массива, но используйте его с осторожностью, так как он может измениться при изменении емкости вектора.
7
ответ дан 14 December 2019 в 08:47
поделиться
  1. В куче (при условии, что вы используете стандартный распределитель, который используется по умолчанию)

  2. Граница не проверяется при использовании оператора [] , но это если вы используете функцию-член в (например, my_vec.at (0) ). Если вы используете в , а индекс находится вне или за пределами, он генерирует исключение std :: out_of_range .

  3. Массивы обычно не быстрее. Это зависит от того, являются ли вызовы вектора operator [] встроенными или нет. Однако большинству современных компиляторов следует его индексировать, поскольку это всего лишь индекс единственного массива.

  4. В общем случае обычные массивы можно заменить векторами. На самом деле вам не следует использовать std :: vector в общедоступном интерфейсе библиотеки, а API библиотеки manu требуют необработанных массивов в стиле C.

0
ответ дан 14 December 2019 в 08:47
поделиться

Где расположены объекты в векторе ? heap?

Это зависит от реализации STL, но, по всей вероятности, в куче, да.

 есть ли у вектора проверка границ? Если индекс выходит за границы, 
какая ошибка произойдет? 
 

Да, вектор растет динамически, вы можете проверить его размер с помощью члена capacity () функция. Если ему не хватает места, он обычно выделяет больше места с помощью функции-члена reserve () .

Почему массив быстрее вектора?

Массивы могут быть быстрее, потому что это простые данные, к которым не нужно обращаться через объект-оболочку, такой как вектор. Вы можете представить себе вектор как аккуратно упакованный массив для вашего удобства.

Есть ли случай, когда вектор неприменим, но массив является обязательным?

Я думаю, могут быть случаи, когда массив предпочтительнее, чем вектор . Например, при работе с устаревшим кодом C или когда скорость имеет первостепенное значение. Но обычно вы можете решить любую проблему с массивом, поместив данные в вектор STL .

0
ответ дан 14 December 2019 в 08:47
поделиться

Объявление 4. При работе с устаревшими интерфейсами (например, POSIX) массивы могут быть необходимыми.

0
ответ дан 14 December 2019 в 08:47
поделиться
  1. По умолчанию содержимое распределяется динамически. (Но я полагаю, вы можете предоставить распределитель, который получает память из другого места.)

  2. Метод at выполняет проверки границ и выдает out_of_range . Другие методы могут проверять или не проверять границы, в зависимости от реализации и настроек.

  3. Я бы предположил, что вектор работает медленнее, чем массив, если он делает что-то отличное от массива. Например, динамическое размещение является дорогостоящим, поэтому у вектора есть стоимость, которой нет у массивов. Динамическое изменение размера вектора является дорогостоящим, в то время как размер массива нельзя изменить вообще. Я бы не ожидал увидеть какую-либо разницу при доступе к элементам (за исключением возможных проверок времени выполнения, выполняемых реализацией, которую вы можете отключить при желании).

  4. Я не знаю такого сценария. Вы всегда можете получить указатель на базовый массив вектора с помощью & vec [0] . Однако вектор может быть излишним, если вам не нужны какие-либо функции, которые он предоставляет - в основном, возможность (изменять) его размер динамически. В таких случаях с массивом может работать нормально, но обратите внимание, что существуют классы, которые также делают массив объектом первого класса ( std :: tr1 :: array или boost :: array ]), которые делают массив копируемым и не превращаются в указатель.

0
ответ дан 14 December 2019 в 08:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: