У меня есть вектор размером более 5 миллионов, каждый раз, когда я хотел бы взять один элемент с наименьшим ключом из вектора и выполнить какой-то процесс с этим элементом. Однако при обработке этого конкретного элемента все остальные элементы в векторе также будут затронуты, так что их ключ обновится. Поэтому в следующий раз, если я захочу выбрать элемент с наименьшим ключом из вектора, я должен снова отсортировать вектор. Проблема заключается в том, что количество извлеченных наименьших элементов из вектора достигнет 0,5 миллиона, так что программа будет работать так медленно. Для вашего более ясного понимания я мог бы написать следующий код для иллюстрации:
void function(vector<MyObj*>& A)
{ //A.size() is near 5 million, maybe even more such as 50 million.
make_heap(A.begin(), A.end(), compare); // compare function is self-defined.
for (int i=0; i<500000; i++)
{
MyObj* smallest_elem = A.front();
pop_heap(A.begin(), A.end());
A.pop_back();
Process_MyObj(smallest_elem); // here all of the elements
// in A will be affect, causing
// their keys changed.
make_heap(A.begin(), A.end()); // Since all elements' keys in A changed,
// so heap sorting A once again is
// necessary in my viewpoint.
}
}
Есть ли способы сделать код максимально эффективным? Приветствуется любая идея, не ограничиваясь улучшением алгоритма, например, параллельным или чем-то еще. Большое спасибо!