Загрузка набора STL с предварительно отсортированными данными, C ++

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

5
задан Jugulum 23 March 2011 в 20:30
поделиться