Исходя из предыдущего вопроса , подход, который я использовал для обработки больших массивов, которые могли расти и сжиматься с разумной эффективностью, заключался в написании контейнера, похожего на deque, который разбивал массив на несколько страниц. меньшие массивы. Например, скажем, у нас есть массив из n элементов, мы выбираем размер страницы p и создаем массивы 1 + n / p (страниц) из p элементов. Когда мы хотим перераспределить и расти, мы просто оставляем существующие страницы там, где они есть, и выделяем новые страницы. Когда мы хотим сжать, мы освобождаем полностью пустые страницы.
Недостатком является то, что доступ к массиву немного медленнее, в этом заданном и индексе i вам понадобится page = i / p и смещение на странице i% p, чтобы получить элемент. Я считаю, что это все еще очень быстро и обеспечивает хорошее решение. Теоретически, std :: deque должен делать что-то очень похожее, но для случаев, которые я пробовал с большими массивами, это было очень медленно. См. Комментарии и примечания по связанному вопросу для получения более подробной информации.
Существует также неэффективность памяти в этих n элементах, мы всегда держим p - n% p элементов в резерве. Т.е. мы только когда-либо выделяем или освобождаем полные страницы. Это было лучшее решение, которое я мог придумать в контексте больших массивов с требованием изменения размера и быстрого доступа, хотя я не сомневаюсь, что есть лучшие решения, которые я хотел бы увидеть их.