Ответ 1
Мне жаль говорить, что ваши одноклассники совершенно неправы. Если ваши одноклассники могут честно сказать, что "векторы связаны списками", то вам нужно с уважением сказать им, что им нужно подобрать хорошую книгу на С++ (или любую достойную компьютерную науку книги) и прочитал его. Или, возможно, даже статьи в Википедии для векторы и списки, (Также см. Статьи для динамические массивы и связанные списки.)
Векторы (как в std::vector
) не являются связанными списками. (Обратите внимание, что std::vector
не выводится из std::list
). Хотя они оба могут хранить коллекцию данных, как вектор полностью отличается от того, как это делает связанный список. Поэтому они имеют разные характеристики производительности в разных ситуациях.
Например, вставки представляют собой операцию с постоянным временем в связанных списках, тогда как это операция с линейным временем на векторах, если она вставлена где-то, кроме конца. (Тем не менее, он амортизируется постоянным временем, если вы вставляете в конец вектора.)
Класс std::vector
в С++ требуется, чтобы быть смежным по стандарту С++:
23.2.4/1 Шаблон класса
vector
A
vector
- это разновидность последовательности, которая поддерживает итераторы произвольного доступа. Кроме того, он поддерживает (амортизируется) постоянное время вставки и стирания операций в конце; вставлять и стирать в середине, принимать линейное время. Управление хранилищем обрабатывается автоматически, хотя можно дать рекомендации для повышения эффективности. Элементы avector
хранятся смежно, что означает, что еслиv
являетсяvector<T, Allocator>
, гдеT
- это какой-то тип, отличный отbool
, то он подчиняется идентификатору&v[n] == &v[0] + n
для всех0 <= n < v.size()
.
Сравните это с std::list
:
23.2.2/1 Шаблон класса
list
A
list
- это разновидность последовательности, которая поддерживает двунаправленные итераторы и позволяет выполнять операции по вставке и стиранию времени в любом месте последовательности, причем управление хранилищем обрабатывается автоматически. В отличие от векторов (23.2.4) и deques (23.2.1) быстрый случайный доступ к элементам списка не поддерживается, но многим алгоритмам нужен только последовательный доступ.
Очевидно, что стандарт С++ предусматривает, что вектор и список представляют собой два разных контейнера, которые делают разные вещи.
Вы не можете "разбить" вектор (по крайней мере, не намеренно), просто называя erase()
допустимым итератором. Это сделало бы std::vector
скорее бесполезным, так как точка его существования - управлять памятью для вас!