Дело в том, что
std::vector
- достаточно хитрая структура, использующая непрерывные блоки памяти для реализации "динамического" массива. Сам объект хранит в себе 2 различных размера -
capacity
(вместимость) и непосредственно
size
. Последний численно равен количеству добавленных Вами элементов, а вот с
capacity
дела обстоят чуточку сложнее.
Как Вы, думаю знаете,
амортизационная асимптотика вставки элемента в вектор равна O(1). Это достигается благодаря "разрастанию"
capacity
вдвое каждый раз, когда размер массива переваливает за его вместимость. Структура ищет в памяти блок, размер которого равен
2 * capacity
и объявляет его занятым, после чего перемещает всю информацию туда. Поскольку массив хранится на непрерывном участке памяти, то к нему вполне применима
адресная арифметика, то есть расстояние от первого элемента вектора до i-ого равно
sizeof(datatype) * i
. Именно благодаря этому доступ к произвольному элементу осуществляется за константное время.
Условия, который были описаны Вами, относятся к указательным структурам данных, где каждый элемент указывает на следующий/предыдущий.