Я буду второй (или, может быть, третий ...) мнение, что std::vector
или std::deque
выполнит эту работу. Единственное, что я добавлю, это несколько дополнительных факторов, которые должны определять решение между std::vector<T>
и std::list<T>
. Они имеют много общего с характеристиками T
и с какими алгоритмами вы планируете использовать.
Первый - память наверху. Std::list
является контейнером на основе узлов, поэтому, если T
является примитивным типом или относительно небольшим пользовательским типом, тогда накладные расходы на память связи на узле могут быть незначительными - считайте, что std::list<int>
, вероятно, будет использовать хранилище не менее 3 * sizeof(int)
для каждый элемент, тогда как std::vector
будет использовать только хранилище sizeof(int)
с небольшими заголовками заголовка. Std::deque
похож на std::vector
, но имеет небольшие накладные расходы, которые линейны до N
.
Следующая проблема - стоимость строительства копии. Если T(T const&)
вообще стоит дорого, то избегайте std::vector<T>
, так как это приводит к появлению множества копий при увеличении размера вектора. Здесь std::deque<T>
является победителем и std::list<T>
также является соперником.
Последним вопросом, который обычно определяет решение о типе контейнера, является то, могут ли ваши алгоритмы работать с ограничениями аннулирования итератора std::vector
и std::deque
. Если вы будете много манипулировать элементами контейнера (например, сортировать, вставлять посередине или перетасовывать), тогда вам может понадобиться наклоняться в сторону std::list
, поскольку для управления порядком требуется немного больше, чем сброс нескольких указателей привязки.
Обратите внимание, что slist является частью дистрибутива sgi STL, но не является частью библиотеки C++ Standard. Однако есть std :: forward_list в C++ 0x/C++ 1x (следующая версия на C++). –
Спасибо, я тоже узнал, что только сейчас. –
Существует также класс std :: list в STL. –
mmmmmmmm