2017-02-05 4 views
0

Перемещает ли все элементы с правой стороны вектора (до 1 позиции слева, если стирает и переместится в 1 позицию справа, если вставить) или это как связанный список (он создает новый адрес и новый адрес. Также, когда я инициализирую вектор со строкой, как он позаботится о памяти. Если он хранит его в последовательности, что произойдет, когда мы продолжим делать push_back, когда он достигнет максимума выделение памяти.Что происходит, когда мы используем векторную стирание или вставку

+0

Если вы заботитесь о скорости, всегда проверяйте, не попадайте на старую «O (N) против O (1), так что O (1) быстрее« ловушка ». В общем, если вы используете std :: и заботитесь о скорости, вектор почти всегда является правильным вариантом. Каждый другой контейнер делает «плохие вещи» (где плохие вещи означают преследующие указатели - даже те вещи, которые не должны нравиться неупорядоченной карте) – xaxxon

+0

Возможно, вы захотите посмотреть _ «Modern C++: что вам нужно знать - Herb Sutter» _ от около 46 минут в презентацию: https://channel9.msdn.com/Events/Build/2014/2-661 Случайные вставки/удаления с использованием std :: vector vs std :: list, вектор выполняет лучше до 500,00 элементов (приблизительно) (также лучше, чем std :: map) –

ответ

5

A std::vector Гарантируется (стандартом C++) для хранения элементов в смежной области памяти. Это означает, что нет, это не похоже на связанный список, а скорее как динамически выделенный массив. push_back после того, как вектор достигнет максимальная емкость происходит перераспределение, и элементы копируются в новый буфер. То же самое происходит, когда вы используете элементы вставки или стирания, вещи сдвигаются так, что эти операции в общем случае O (N), а не O (1), как это имеет место для связанных списков.

Похоже, что std::vector хуже, чем std::list. Это не так, поскольку, как и во многих приложениях, операции чтения являются доминирующими, для которых std::vector намного быстрее, чем std::list из-за локальности кэша и произвольного доступа O (1) из-за того, что элементы хранятся смежно. Также push_back - это O (1), за исключением случаев, когда вектор выполняет перераспределение (технически push_pack амортизировал сложность O (1)).

+0

Спасибо, но как бы определить, сколько размера ему нужно выделить для строки или просто сохранить адрес строки? – user3345850

+0

Что значит точно вектор, инициализированный строкой? С помощью 'std :: string'? Если он является вектором 'std :: string', тогда распределитель просто выделяет память для' std :: string' ** objects ** (которые имеют фиксированный размер, то есть 'sizeof (std :: string)' , последний позаботится о своей собственной памяти для строки, которую он хранит внутренне. – vsoftco

+0

std :: vector user3345850

Смежные вопросы