Я считаю, что я хотел бы использовать boost :: icl :: interval_map для решения проблемы (описано Вот, Я опубликую полный ответ, если интервал_карты в конечном счете сработают.)
Я хочу использовать interval_map<unsigned long long, set<foo*>>
, но в документации для boost :: icl упоминается, что существуют потенциальные проблемы с эффективностью (ниже от).
Мы представляем интервал_карты, используя карту интервалов наборов строк, из-за ее дидактических преимуществ. Пример партии используется, чтобы дать немедленный доступ к основным идеям карт интервалов и агрегировать на перекрытии. Для реальных приложений интервал_карта наборов не обязательно рекомендуется. Он имеет те же проблемы с эффективностью, что и std :: map для std :: sets. Тем не менее, существует большая область использования interval_maps с числовыми и другими эффективными типами данных для связанных значений.
Каковы проблемы эффективности с std :: map of std :: sets?
а также Как я могу избежать их?
И то и другое std::map<K, V>
а также std::set<V>
являются узлами на основе контейнеров, связанных указателями. Обход их имеет хорошие гарантии сложности (то есть каждая отдельная операция не более O (log n)), но на самом деле вам нужны достаточно большие контейнеры для сложности по сравнению с, например, std::vector<std::pair<K, V>>
особенно когда K
а также V
являются фундаментальными типами. Основная проблема производительности с контейнерами на основе узлов заключается в том, что они более или менее случайным образом размещаются в памяти, в то время как современные процессоры предпочитают получать доступ к данным, кластеризованным в той или иной форме.
Конечно, как обычно, вам нужно измерить время, полученное между различными реализациями на довольно реалистичных наборах данных, чтобы определить, какая структура данных обеспечивает наилучшую производительность.
Других решений пока нет …