Я работаю с 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, ...)