Какой самый быстрый способ реинициализации вектора?
Не.
Просто запишите тот факт, что вектор не имеет допустимых записей, вызвав clear()
. Преимущество этого в том, что он (вероятно) оптимален, и гарантированно корректен, а также является совершенно выразительным. ИМО ни одна из предложенных альтернатив не должна рассматриваться, если только профилирование не показывает фактическую необходимость.
Ваш тип элемента тривиален, поэтому линейная верхняя граница сложности в действительности должна быть постоянной для реализации достойного качества - нет необходимости уничтожать каждый элемент по очереди.
Нет памяти, которая была освобождена или должна быть перераспределена позже.
Вам просто нужно будет push_back
или emplace_back
, когда вы будете писать в вектор после clear()
ing, вместо использования operator[]
.
Чтобы сделать это совместимым с первым использованием, не инициализируйте ваш вектор 10000000 сконструированными значениями элементов, но используйте reserve(10000000)
для предварительного выделения без инициализации.
например.
int main() {
vector<foo> v;
v.reserve(10000000);
while(keep_running) {
use(v);
v.clear();
}
}
// precondition: v is empty, so
// don't access v[i] until you've done
// v.push_back({id,score})
// at least i+1 times
void use(vector<foo> &v) {
}
Так как вам нужно обнулить ваши элементы на месте, второе самое быстрое решение общего назначения, вероятно, состоит в том, чтобы изменить цикл выше на
while(keep_running) {
v.resize(10000000);
use(v);
v.clear();
}
или, альтернативно, удалите clear()
и используйте fill()
, чтобы перезаписать все элементы на месте.
Если ненулевые элементы редки, как, например, если вы обновляете их на основе какого-либо значимого индекса, может быть быстрее обнуление их на лету, поскольку ваш основной цикл выполняет итерации по вектору.
Опять же, вам действительно нужно профиль , чтобы узнать, что лучше для вашего варианта использования.