Я очень рад использовать std:: Flat_map и std:: Flat_set в своей базе кода. Есть несколько случаев, когда мне нужно сохранить упорядоченный набор данных с возможностью поиска в непрерывной памяти, а затем передать его в другую функцию в виде простого массива в стиле C. Исторически я делал это, вручную вставляя сортировку в std::vector или массовую вставку, а затем вызывая std::sort(). Я обертываю std::lower_bound() в метод доступа для поиска, получаю доступ к ```std::vector::data()`` и все готово.
С std::flat_map Все это я получаю в стандарте. Однако API, похоже, не имеет возможности зарезервировать хранилище перед созданием адаптера. Я решил эту проблему, сначала создав контейнеры для ключа и значения самостоятельно, зарезервировав каждый из них, а затем переместив их в адаптер, но это обременительно. Это также не позволяет мне зарезервировать дополнительное хранилище позже, если произойдет массовая вставка или будет известно об изменении предполагаемой верхней границы.
Похоже, что внутренние контейнеры являются частными, согласно стандарту, поэтому с помощью подклассов добраться до него невозможно. И std::flat_map::keys(), и std::flat_map::values() возвращают константные ссылки, так что это бесполезно. Полагаю, я мог бы использовать std::flat_map::extract() для возврата контейнеров, а затем зарезервировать больше места для хранения, а затем на месте создать новую исходную карту?
Все это кажется немного неуклюжим. Моя цель — уменьшить перераспределение (и фрагментацию) в моей среде, где у меня нет преимуществ диспетчера виртуальной памяти, а затраты на распределение не являются незначительными.
Подробнее здесь: https://stackoverflow.com/questions/790 ... ng-storage
Std:: Flat_map, std:: Flat_set и резервирование памяти? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение