Как stl vector дает произвольный доступ

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

Я пытался заглянуть в код, но безуспешно. Кто-нибудь может дать несколько советов?

Спасибо, Арун


person Arun Chhetri    schedule 11.11.2009    source источник
comment
указатели... ха-ха-ха -› xkcd.com/138   -  person Billy ONeal    schedule 11.11.2009


Ответы (4)


Vector использует непрерывную память внизу, поэтому он предоставляет произвольный доступ так же, как массив, по сути: он знает начальный адрес и размер элементов и выполняет некоторые математические операции с указателями.

person i_am_jorf    schedule 11.11.2009

Конечно, вот несколько советов:

int *x, *y;

А если серьезно, vector внутренне просто реализован как массив. Он предоставляет перегруженный оператор индексации ([]), позволяющий обращаться к нему как к массиву.

person Thomas    schedule 11.11.2009
comment
+1 (+2 за предоставление нескольких указателей, но -1 за неинициализированные указатели :) - person Oren S; 11.11.2009

как минимум в два раза

На самом деле, во многих реализациях используется коэффициент 1,5. Важно то, что это коэффициент, поэтому вы получаете экспоненциальный рост вектора.

person Fred    schedule 11.11.2009

Vector обычно использует реализацию динамического массива [*]... все время данные хранятся в непрерывном блоке памяти, так что арифметика указателя может использоваться для O (1) доступа к любому (уже существующему) элементу.

Хитрость эффективных динамических массивов (при условии, что вы этого еще не знаете) заключается в том, чтобы всегда увеличивать размер зарезервированного хранилища, по крайней мере, на постоянный коэффициент (см. комментарий Джерри Коффина). Результатом этого является то, что когда мы добавляем неопределенное количество новых элементов, принимая коэффициент за 2 для простоты, первый элемент копируется при n-м добавлении, а (2*n) добавляется и (4*n)-то добавляется. и ...

Этот ряд сходится, поэтому мы можем гарантировать, что добавление N новых элементов потребует O(N) времени. Однако любое данное добавление может потребовать перераспределения и копирования всех существующих элементов, поэтому нет никакой гарантии задержки.

[*] Я не знаю другого механизма, обеспечивающего требуемую производительность. Кто угодно?

person dmckee --- ex-moderator kitten    schedule 11.11.2009
comment
Хотя вы хотите увеличить размер на постоянный коэффициент, обычно вы хотите использовать коэффициент меньше, чем два. Как довольно давно продемонстрировал Эндрю Кениг, обычно требуется коэффициент меньше 1+sqrt(5)/2 — это приводит к лучшему повторному использованию памяти с течением времени. - person Jerry Coffin; 11.11.2009
comment
Хотя (1+sqrt(5))/2 нет. Так что я готов поверить, что претензия не полная чушь, а просто опечатка... - person Steve Jessop; 12.11.2009