• hash_
… или стандартными unordered_
… контейнерами), затем — отсортированным vector
, затем — set
или map
, обычно в приведенном порядке. Даже в этой ситуации отличия асимптотического времени работы (с использованием "большого
• list
, set
, map
).
В противном случае следуйте совету Стандарта: "vector
представляет собой тип последовательности, который нужно использовать по умолчанию" ([C++03] §23.1.1).
Если вы сомневаетесь в данном совете, спросите сами себя — действительно ли у вас есть непреодолимые причиныvector
, который обладает следующими свойствами.
• Гарантирует минимальные среди всех контейнеров накладные расходы памяти на хранение (ноль байтов на объект).
• Гарантирует наивысшую среди всех контейнеров скорость доступа к хранимым элементам.
• Гарантирует локальность ссылок, означающую, что объекты, находящиеся рядом друг с другом в контейнере, гарантированно находятся рядом и в памяти, что не гарантирует ни один другой контейнер.
• Гарантирует совместимость размещения в памяти с размещением, используемым языком программирования С, в отличие от остальных стандартных контейнеров (см. рекомендации 77 и 78).
• Гарантирует наличие самых гибких итераторов (произвольного доступа).
• Почти гарантированно имеет самые быстрые итераторы (указатели или классы со сравнимой производительностью, которые зачастую работают в окончательной (не отладочной) версии с той же скоростью, что и указатели).
vector
и спокойно работайте, зная, что вы сделали верный выбор.
И последнее — лучше использовать контейнеры и алгоритмы стандартной библиотеки, а не стороннего производителя или разработанные самостоятельно.
list
только потому, что "очевидно, что list
—подходящий тип для выполнения операций со списком", таких как вставка в средину последовательности. Тип vector
для небольших списков практически всегда превосходит тип list
. Несмотря на то, что вставка в средину последовательности требует линейного времени работы у vector
, и постоянного — у list
, вектор с небольшим количеством элементов обычно справляется с этой задачей быстрее — за счет меньшего постоянного множителя; преимущества асимптотического времени работы list
проявляются только при больших количествах элементов в контейнере.
Таким образом, используйте vector
, пока размеры данных не потребуют иного выбора (см. рекомендацию 7), либо пока не станет существенной обеспечение строгой гарантии безопасности при возможной генерации исключений копирующим конструктором или копирующим оператором присваивания типа объектов, хранящихся в контейнере. В последнем случае может оказаться важным, что контейнер list
обеспечивает строгую гарантию безопасности для операции вставки в коллекцию таких типов.