В ваших примерах массив находится в стеке. Доступ к данным в массиве предполагает доступ к данным в стеке. Это быстро.
С другой стороны, пока vector
находится в стеке, данные для std::vector
размещаются где-то еще (по умолчанию они размещаются в куче через std::allocator
). Доступ к данным в vector
предполагает доступ к данным в куче. Это намного медленнее, чем доступ к данным в стеке.
Вы получаете что-то за штраф за производительность. std::vector
является расширяемым, а обычный массив - нет. Кроме того, размер std::vector
не обязательно должен быть постоянной времени компиляции, в то время как размер массива в стеке имеет значение. Выделенный в куче массив (через operator new[]
) не обязательно должен быть константой времени компиляции. Если вы сравните массив, выделенный для кучи, с std::vector
, то увидите, что производительность намного ближе.
int* arr = new int[10000];
for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 10000; j++)
{
arr[j] = j;
}
}
delete[] arr; // std::vector does this for you