Я работаю с C ++ в Visual Studio 2010. У меня есть набор STL, который я сохраняю в файл, когда моя программа закрывается. При следующем запуске программы я загружаю (отсортированные) данные обратно в набор. Я пытаюсь оптимизировать процесс загрузки, и у меня возникли проблемы. Я подозреваю, что проблема в частой перебалансировке, и я ищу способ избежать этого.
Сначала я сделал это без оптимизации, используя "set-> insert (const value_type & x)"
Время: ~ 5,5 минут
Затем я попытался использовать версию insert (), где вы указываете подсказку для местоположения вставки ():
iterator insert ( iterator position, const value_type& x );
Грубо говоря, я сделал это:
set<int> My_Set;
set<int>::iterator It;
It = My_Set.insert (0);
for (int I=1; I<1000; I++) {
It = My_Set.insert (It, I); //Remember the previous insertion's iterator
}
Время: ~ 5,4 минуты
Едва ли улучшения! Я не думаю, что проблема заключается в накладных расходах при чтении из файла - комментирование insert () сокращает время до 2 секунд. Я не думаю, что проблема заключается в накладных расходах при копировании моего объекта - это объект Plain Old Data с int и char.
Единственное, о чем я могу думать, это то, что набор постоянно перебалансирован.
1.) Согласны ли вы с моим предположением?
2.) Есть ли способ «приостановить» перебалансировку, пока я загружаю набор, и затем перебалансировать один раз в конце? (Или ... Это даже поможет?)
3.) Есть ли более разумный способ загрузки отсортированных данных, то есть не просто переход от низшего к высшему? Возможно, чередуя мои вставки, чтобы не приходилось часто балансировать? (Пример: вставить 1, 1000, 2, 999, 3, 998, ...)