Лучшим вариантом будет, если это возможно, предотвратить неупорядоченные данные. Как уже было упомянуто, вам лучше читать данные с диска (или сети, или любого другого источника) непосредственно в самоорганизующийся контейнер (дерево, возможно, подойдет std::set
).
Таким образом, вам никогда не придется разбирать партии или беспокоиться об управлении памятью. Если вы знаете требуемую емкость контейнера, вы можете выжать дополнительную производительность, используя std::vector(initialcapacity)
или позвонив vector::reserve
заранее.
Тогда вам лучше всего использовать std::make_heap
до heapify любых существующих элементов, а затем добавлять элемент за элементом, используя push_heap
(см. Также pop_heap
). По сути, это та же парадигма, что и у самоупорядочивающегося множества, но
- Дубликаты в порядке
- хранилище «оптимизировано» в виде плоского массива (что идеально подходит, например, для карт совместно используемой памяти или файлов с отображенной памятью )
(О, мелкие детали, обратите внимание, что sort_heap
в куче занимает не более N log N сравнений, где N - количество элементов)
Дайте мне знать, если вы считаете, что это интересный подход. Мне действительно нужно немного больше информации о сценарии использования