Контейнер для файлов

Какой использовать контейнер для файлов std::ifstream, если надо поддерживать добавление в конец/удаление произвольного/проход по всем файлам? Можно даже не поддерживать добавление в конец, а чтобы можно было добавить 1 раз при создании контейнера.

std::vector работает, но медленно удаляет.

std::set не работает -- нужен оператор <.

std::unordered_set не работает -- нужен хеш.

Не понимаю, как можно сравнивать/хешировать такие объекты.


Ответы (1 шт):

Автор решения: KoVadim

Раз Вам порядок не важен (Вы же смотрели на std::set), вместо обычного удаления элемента, просто заменяйте его последним элементом. А последний элемент просто выбрасывайте. Правда, если конструкторы и деструкторы немного не тривиальны, возможно нужно будет "доработать напильником. Скорость удаления будет константной (ну или очень близкой к ней).

Использование std::list хоть и выглядит хорошо, но по факту дает ощутимый результат только в очень редких случаях. std::list хранит каждый свой элемент в отдельном куске памяти, а значит данные могут лежать разбросанными по памяти (привет кешам и просадке скорости прохода по элементам в несколько раз, а то и десяток раз). Также список очень не дружелюбен к менеджерам памяти. Поэтому, в высоконагруженных приложениях его применяют только после профилирования или обкладывания своим аллокатором.

Вот одно с интересных сравнений https://baptiste-wicht.com/posts/2012/11/cpp-benchmark-vector-vs-list.html

→ Ссылка