Я могу понять, когда использовать списки, но не понимаю, когда лучше использовать векторы, чем использовать списки в видеоиграх: когда лучше иметь быстрый произвольный доступ?
(И я понимаю, почему быстрее добавлять / удалять в списках, потому что он просто удаляет / добавляет указатели, но все равно должен найти соответствующий элемент ...)
c++
algorithm
data-structure
jokoon
источник
источник
container
.Ответы:
Мое эмпирическое правило, и я уверен, что будут дебаты по этому вопросу, никогда не используйте списки (если вам не нужно очень, очень часто удалять вещи из середины больших списков).
Скорость, которую вы получите, поместив все свои элементы в свой контейнер в непрерывную память (и, следовательно, более дружественную к кешу), стоит возмещения дополнительных затрат на добавление / удаление / изменение размера вектора.
Редактировать: просто, чтобы прояснить немного больше, конечно, само собой разумеется, что любой вопрос «который быстрее» должен быть протестирован на любой платформе с любыми наборами данных, которые соответствуют вашим конкретным потребностям. Если мне просто нужна коллекция элементов, я просто использую vector (или deque, что почти то же самое), если нет веской причины не делать этого.
источник
Используйте список, когда аннулирование итератора, вызванное изменением середины вашей структуры данных, может вызвать проблему, или вам нужно держать свои элементы отсортированными, чтобы трюк swap и pop для быстрого удаления средней коллекции не работал, и у вас большой количество удалений середины коллекции.
Вы также можете рассмотреть возможность использования Deque. Он имеет характеристики производительности, схожие с векторными, но не требует векторной смежной памяти и немного более гибок.
источник
Ваш выбор должен отражать ваши потребности. Все элементы векторов непрерывны в памяти, и списки имеют указатели на следующие / предыдущие элементы, поэтому у каждого из них есть свои преимущества / недостатки:
Списки:
Векторы:
Таким образом, список лучше, когда вашей программе нужно часто добавлять и удалять элементы, но никогда не получать (или редко обращаться) к определенному элементу без необходимости в других. Вектор должен использоваться для лучшего времени доступа, но он недостаточно эффективен, когда вам нужно удалить или добавить элементы.
Проверьте этот пост на stackoverflow, он представляет действительно хороший график с базовыми вопросами о ваших потребностях, который приводит вас к конкретному контейнеру в зависимости от ваших ответов:
/programming/366432/extending-stdlist
источник
Обычно списки используются для таких структур, как очереди, где есть много операций добавления и удаления. Пример: постоянно меняющийся список объектов, которые должны быть обновлены. Сам список содержит только объекты на экране и поэтому часто меняется.
Векторы (или массивы) лучше подходят для коллекции, которая не сильно меняется, и где вам нужен быстрый доступ к отдельным элементам в коллекции. Пример: карта тайлов, где вы должны искать тайлы по заданному индексу.
Мнение Tetrads может быть правдой, но это зависит от языка программирования, который используется. Я вижу, что вы пометили свой вопрос
c++
, но я попытался дать ответ, который не зависит от языка.источник
В консольных играх мы никогда не используем std :: list, потому что:
даже std :: vector теряет популярность на консолях, потому что:
источник
struct point{float x, y, z, w}; std::vector<point> positions;
point
объекта C ++ (как естьstd::vector
, так же просто, какfloat
). Я знаю разницу, которую вы пытаетесь провести, но вы плохо объясняете это.