Вы можете потратить половину семестра, говоря о любом из контейнеров, но вот несколько моментов:
std::vector
- это непрерывный контейнер, что означает, что каждый элемент следует сразу после предыдущего элемента в памяти.Он может расти во время выполнения, что означает, что он выделяет свое хранилище в динамической памяти.
std::list
- это двунаправленный связанный список.Это означает, что элементы разбросаны в памяти в произвольной компоновке, и что каждый элемент знает, где находятся следующий и предыдущий элементы в последовательности.
std::vector
, std::list
, а другие контейнеры не вступают во владениеэлементов, которые они держат, но они убирают за собой.Таким образом, если элементы являются указателями на динамическую память, то пользователь должен освободить указатели до разрушения контейнера.Но если контейнер содержит автоматические данные, то деструкторы данных будут вызывать его автоматически после очистки контейнера.
Пока что все очень просто и примерно эквивалентно любому другому языку или набору инструментов.Что уникально в STL, так это то, что контейнеры являются общими и отделены от средств итерации по ним и (по большей части) от операций, которые вы можете выполнять над ними.Некоторые операции могут быть выполнены особенно эффективно с некоторыми контейнерами, поэтому контейнеры будут обеспечивать функции-члены в этих случаях.Например, std::list
имеет функцию-член sort()
.
STL не предоставляет контейнер классов (по большей части), а скорее контейнер шаблонов .Другими словами, когда библиотека говорит о контейнере, она только анонимно обращается к типу данных, скажем, как T
, но не по его истинному имени.Никогда int
или double
или Car
;всегда T
, для любого типа.Есть исключения, такие как std::vector<bool>
, но это общий случай.Затем, когда пользователь создает экземпляр шаблона контейнера, он указывает тип, и компилятор создает класс контейнера из шаблона для этого типа.
STL также предлагает алгоритмы в качестве свободных функций шаблона.,Эти алгоритмы работают на итераторах , самих шаблонах.Часто итераторы приходят парами, которые обозначают начало и конец последовательности, в которой работает алгоритм.std::vector
, std::list
и другие контейнеры затем предоставляют свои собственные итераторы, которые могут перемещаться и манипулировать своими данными.Таким образом, тот же бесплатный алгоритм может работать с std::vector
и std::list
и другими контейнерами, при условии, что итераторы соответствуют определенным предположениям о способностях итераторов.
Вся эта абстракция выполняется во время компиляции,и это самая большая разница по сравнению с другими языками.Это приводит к выдающейся производительности с относительно коротким и лаконичным кодом.Та же производительность, что и в C, вы получите только с большим количеством вставок или жестких кодов.