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