Прежде чем делать НИЧЕГО, профилируйте код и получите эталонный тест. После того, как вы внесете изменения в профиль, получите код и получите тест. Сравните показатели. Если вы этого не сделаете, вы бросаете кости. Это быстрее? Кто знает.
профиль профиль профиль.
С push_back
у вас есть две основные проблемы:
- Изменение размера
vector
при заполнении и
- Копирование объекта в
vector
.
Существует ряд улучшений, которые можно внести в стоимость изменения размера push_back
в зависимости от того, как добавляются элементы.
Стратегическое использование reserve
, например, для минимизации размера изменения размера. Если вы знаете, сколько элементов будет добавлено, вы можете проверить capacity
и size
, чтобы узнать, стоит ли вам потратить время на reserve
, чтобы избежать многократного изменения размера. Обратите внимание, что для этого требуется знание стратегии расширения vector
, которая зависит от конкретной реализации. Оптимизация для одной vector
реализации может быть ужасной ошибкой для другой.
Вы можете использовать insert
для добавления нескольких элементов одновременно. Конечно, это почти бесполезно, если вам нужно добавить еще один контейнер в код для массовой вставки.
Если вы не знаете, сколько элементов поступает, вы можете также позволить vector
выполнить свою работу и оптимизировать, КАК элементы добавляются.
Например
void addToContainer(Object object) // pass by value. Possible copy
{
container.push_back(object); // copy
}
Эти копии могут быть дорогими. Избавься от них.
void addToContainer(Object && object) //no copy and can still handle temporaries
{
container.push_back(std::move(object)); // moves rather than copies
}
std::string
часто очень дешево перемещать.
Этот вариант addToContainer
можно использовать с
addToContainer({ "Fira", "+5 ATTACK" });
addToContainer({ "Potion", "+10 HP" });
и может просто перенести указатель и как можно меньше учетных переменных на string
. Они временные люди, поэтому никому нет дела, если они вырвут их кишки и выбросят трупы.
Что касается существующих Object
s
Object o{"Pizza pop", "+5 food"};
addToContainer(std::move(o));
Если они расходуются, они также перемещаются. Если они не расходуются ...
void addToContainer(const Object & object) // no copy
{
container.push_back(object); // copy
}
У вас перегрузка, которая делает это нелегко.
Подбрасывание этого
Если у вас уже есть несколько элементов, которые, как вы знаете, будут в списке, вместо добавления их всех по одному, используйте список инициализации:
vector<Object> container{
{"Vorpal Cheese Grater", "Many little pieces"},
{"Holy Hand Grenade", "OMG Damage"}
};