Сравнивать между stl контейнерами и массивами? - PullRequest
0 голосов
/ 28 ноября 2011

В каком случае использование векторов или наборов (контейнеров stl) выгодно по сравнению с обычными массивами?

Ответы [ 5 ]

4 голосов
/ 28 ноября 2011

«Нормальные массивы» - это статические объекты: их размер фиксирован и определяется во время компиляции. Динамические контейнеры могут иметь произвольное количество элементов, которые могут изменяться во время выполнения.

Обязательно, динамические контейнеры должны использовать более дорогие операции выделения памяти, чем статические массивы.Если вам нужен динамический контейнер, его нельзя обойти, но если статического массива достаточно, вы можете предпочесть это (но используйте std::array!).

Обратите внимание, что статические массивы с автоматическим хранением обычно не могут бытьслишком большой, поскольку программы, как правило, имеют ограниченную память для автоматических объектов.

Еще один момент - Утилита : Некоторые расширенные структуры данных, такие как связанные списки и деревья двоичного поиска, доступны только в стандартной библиотеке,динамические контейнеры.Если вам нужен список, очередь или карта, даже если она небольшого размера и имеет ограниченный размер, динамические контейнеры легко доступны, в то время как в стандартной библиотеке нет статического аналога.(Однако благодаря allocators , используемым стандартными контейнерами, вы всегда можете поместить динамический контейнер в статический массив, используя распределитель типа пула. C ++ отделяет время жизни объекта от времени жизни памяти.)

1 голос
/ 28 ноября 2011

Я полагаю, что почти никогда нет причин использовать std :: vector. У std :: deque есть все преимущества (постоянный доступ и т. д.) без каких-либо недостатков (ужасная производительность при изменении размера). только раз, когда вы выбираете вектор вместо deque, - это если вам нужен факт, что он поддерживается настоящим старомодным массивом в стиле C. И единственная причина этого в том, что вам нужно передать ее в какую-то устаревшую функцию (в виде массива).

Преимущества вектора перед традиционным массивом ограничены. Он будет расти, если вы вставите после его текущего размера, но крайне неэффективно (лучший вариант см. В std :: deque). Индекс за концом вектора так же легко индексировать, как и массив, поэтому никакой пользы здесь нет. Качество управления памятью таково, что оно будет выделять / освобождать элементы, которые оно содержит. Но это, как правило, указатели, так что это не помогает. Если это экземпляры (не указатели), то массив также будет правильно их распределять / освобождать.

Если мне нужен массив, я бы, вероятно, выбрал вектор, потому что он имеет несколько хороших API-функций, таких как size, begin, & end. Но в целом мое предложение НЕ ИСПОЛЬЗУЙТЕ НИ ОДНОГО! ПЕРЕЙТИ С std :: deque INSTEAD!

0 голосов
/ 29 ноября 2011

Большую часть времени стандартные контейнеры будут предпочтительнее старомодного массива.У них просто намного больше возможностей.Единственный раз, когда массив будет более разумным по сравнению с std :: vector, это когда размер известен во время компиляции и достаточно мал (т.е. не мегабайт), и вам нужно сохранить накладные расходы на выделение кучи.Иногда массив несколько удобнее, так как вы можете передать arr вместо &vec[0] в функцию, но это очень маленькая цена.

Если у вас возникли проблемы с выбором между std :: vectorи std :: set и другие стандартные контейнеры, см. здесь: В каком сценарии я использую конкретный контейнер STL?

0 голосов
/ 28 ноября 2011

Выгодно, чем? set, multiset, vector, list, map, deque, stack, queue, priority_queue, multimap, bitset все реализованы по-разному. Это зависит от того, что вы делаете. Некоторые реализованы с помощью сбалансированного дерева, некоторые с непрерывным массивом, некоторые - как связанные списки и т. Д. Некоторые быстрее вставляют, некоторые быстрее получают доступ, некоторые хорошо удаляются при удалении и т. Д.

Ни один контейнер не всегда выгоден другому, иначе другой не существовал бы. Частью разработки программного обеспечения является возможность принимать решения, такие как «какой контейнер следует использовать», так каков ваш реальный вопрос и как вам нужен ваш контейнер, чтобы быть выгодным?

Очевидно, что массивы всегда будут быстрее, чем векторы, потому что нижележащий компонент вектора является массивом, поэтому вектор будет иметь только накладные расходы. Но эти накладные расходы делают для вас много замечательных вещей, а это значит, что вам не нужно беспокоиться о множестве вещей, о которых вам нужно беспокоиться с массивами.

0 голосов
/ 28 ноября 2011

Одним из преимуществ является то, что контейнеры STL позаботятся об управлении памятью и с меньшей вероятностью приведут к переполнению буфера или утечке памяти, чем массивы в стиле C. Они также уже построены, поэтому вам не нужно тратить время на то, чтобы заново изобрести колесо. Поэтому, когда вы беспокоитесь о таких вещах, контейнеры STL - лучший выбор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...