Несколько вопросов о векторе в STL - PullRequest
5 голосов
/ 22 марта 2010

У меня есть несколько вопросов о векторе в STL, чтобы уточнить .....

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

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

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

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

Ответы [ 5 ]

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

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

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

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

0 голосов
/ 22 марта 2010
  1. В куче (при условии, что вы используете стандартный распределитель, который используется по умолчанию)

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

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

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

0 голосов
/ 22 марта 2010

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

0 голосов
/ 22 марта 2010

Где находятся объекты в векторе выделяется? кучи?

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

does vector have boundary check? If the index out of the boundary, 
what error will happen?

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...