Если записи генерируются в порядке их time
значений и , то time
не изменяется при обновлении, чем вы можете просто:
- Добавить записи в
std::vector<entry*>
(или std::list<entry*>
) по мере их создания. - И также добавить их в
std::map<std::string, entry*>
(или std::unordered_map<std::string, entry*>
).
map
позволяет осуществлять быстрый поиск во время обновлений.Когда придет время вывести записи в файл, просто проследуйте по порядку std::vector
.
(Существуют варианты, которые могут сэкономить некоторые кучи, например: std::vector<entry>
и std::map<std::string, std::vector<entry>::size_type>
, где size_type
- индекс элемента вектора.)
Если, однако, вам также необходимо обновить time
, я не думаю, что вы будетевозможность избежать использования std::multimap
вместо std::vector
.
- EDIT ---
OK, поэтому у вас нет порядка time
, как насчет этого:
Поддерживать только один map<string, entry>
, и когда придет время записать его в файл, сгенерировать из него vector< map<string, entry>::const_iterator >
и std::sort
на time
(используйте comparer параметр std::sort
).
Замечания:
- Вы также можете просто использовать
vector<entry*>
для сортировки - идея в том, что вы не выделяете никакихновые записи, вы просто «указываете» на записи в map
. - Также обратите внимание, что вы можете предварительно зарезервировать
vector
для соответствия map.size()
, поэтому перераспределения векторов избегают. - Если вам не нужна сортировка по идентификаторам записей, рассмотрите возможность использования
unordered_map
(вместо простого map
) для повышения производительности.
В целом это дешевле, чем поддержаниевторой map
, но добавляет задержку перед сбросом в файл.В зависимости от ваших требований к производительности, это может быть или не быть оптимальным решением.