Вы можете немного улучшить положение вещей, если вы бросите карту и разделите вектор. Это подразумевает переупорядочение списка входных файлов. Это также означает, что вы должны найти способ быстро определить, был ли файл уже обработан, возможно, удерживая флаг в классе File
. Если можно изменить порядок списка файлов и если вы можете сохранить этот грязный флаг в объекте File
, то вы можете повысить производительность с O (n log m) до O (n) для n файлов и m обработанных файлов.
#include <algorithm>
#include <functional>
// ...
vector<File*>::iterator end(partition(inputfiles.begin(), inputfiles.end(),
not1(mem_fun(&File::is_processed))));
for_each(inputfiles.begin(), end, processFile);
Если вы не можете переупорядочить список файлов или не можете изменить объект File
, тогда вы можете переключить map
с помощью vector
и затемнить каждый файл в списке входных файлов с помощью флажка второй вектор с тем же индексом. Это будет стоить вам O (n) места, но даст вам O (1) проверку на грязное состояние.
vector<File*> processed(inputfiles.size(), 0);
for( vector<File*>::size_type i(0); i != inputfiles.size(); ++i ) {
if( processed[i] != 0 ) return; // O(1)
// ...
processed[i] = inputfiles[i]; // O(1)
}
Но будьте осторожны: вы имеете дело с двумя разными указателями, указывающими на один и тот же адрес, и это относится к каждой паре указателей в двух контейнерах. Убедитесь, что один и только один указатель владеет указателем.
Я не ожидаю, что какой-либо из них даст решение для такого снижения производительности, но тем не менее.