Большая часть зависит от того, о каком контейнере вы говорите и как вы его используете.
Вектор обычно имеет наименьшую площадь, за исключением того момента, когда вы добавляете элемент, который превышает текущую емкость вектора. В этот момент он выделит что-то вроде 1,5-кратной текущей емкости векторов, переместит элементы (или в худшем случае создаст новую копию, которая также выделяет память), а когда это будет сделано, удалит старые внутренние векторы, если вы знаете, как много элементов, которые он собирается держать впереди, вектор с использованием резерва - ваша лучшая ставка.
Второй самый маленький список. Он имеет преимущество в том, что не собирается делать временную копию самого себя. После этого набора ваша лучшая ставка, вероятно, установлена. В некоторых реализациях теперь есть slist, который меньше. В этих случаях довольно легко создать распределитель, который упаковывает память в страницы.
Держись подальше от памяти свиней, как неупорядоченные_ *
На MSVC обязательно #define _SECURE_SCL = 0 Это устраняет много накладных расходов, используемых для проверок безопасного программирования (например, переполнения буфера и т. Д.)
Безусловно, наиболее эффективные для памяти контейнеры являются наддувами / навязчивыми. Они имеют очень малые следы, поскольку используют память того, что в них содержится. Таким образом, в стремлении перейти к куче небольшого куска памяти для связанного списка или узла дерева rb, указатели узлов являются частью самого объекта. Тогда «контейнер» - это всего лишь один необработанный набор из нескольких указателей для создания корневого узла. Я использовал его несколько раз, чтобы избавиться от площади и затрат на распределение.