Контейнер для файлов
Какой использовать контейнер для файлов std::ifstream, если надо поддерживать добавление в конец/удаление произвольного/проход по всем файлам? Можно даже не поддерживать добавление в конец, а чтобы можно было добавить 1 раз при создании контейнера.
std::vector работает, но медленно удаляет.
std::set не работает -- нужен оператор <.
std::unordered_set не работает -- нужен хеш.
Не понимаю, как можно сравнивать/хешировать такие объекты.
Ответы (1 шт):
Раз Вам порядок не важен (Вы же смотрели на std::set), вместо обычного удаления элемента, просто заменяйте его последним элементом. А последний элемент просто выбрасывайте. Правда, если конструкторы и деструкторы немного не тривиальны, возможно нужно будет "доработать напильником. Скорость удаления будет константной (ну или очень близкой к ней).
Использование std::list хоть и выглядит хорошо, но по факту дает ощутимый результат только в очень редких случаях. std::list хранит каждый свой элемент в отдельном куске памяти, а значит данные могут лежать разбросанными по памяти (привет кешам и просадке скорости прохода по элементам в несколько раз, а то и десяток раз). Также список очень не дружелюбен к менеджерам памяти. Поэтому, в высоконагруженных приложениях его применяют только после профилирования или обкладывания своим аллокатором.
Вот одно с интересных сравнений https://baptiste-wicht.com/posts/2012/11/cpp-benchmark-vector-vs-list.html