Просто немного подробнее о том, что уже было сказано.
Сортированные контейнеры
Здесь неизменность очень важна: std::map
и std::set
обычно реализуются в виде двоичных деревьев (красно-черные деревья для моих нескольких версий STL) из-за требований к операции вставки, извлечения и удаления ( и особенно из-за признания недействительными требований итераторов).
Однако из-за неизменности, как вы и подозревали, есть и другие кандидаты, не в последнюю очередь из них контейнеры, похожие на массивы. У них здесь есть несколько преимуществ:
- минимальные накладные расходы (в плане памяти)
- смежность памяти и, следовательно, локальность кэша
Несколько «Контейнеров произвольного доступа» доступны здесь:
Boost.Array
std::vector
std::deque
Таким образом, единственное, что вам действительно нужно сделать, может быть разбито за 2 шага:
- поместите все ваши значения в выбранный вами контейнер, затем (после того, как все будет вставлено) используйте
std::sort
для него.
- поиск значения с использованием
std::binary_search
со сложностью O (log (n))
Из-за локальности кэша поиск будет на самом деле быстрее, даже несмотря на то, что асимптотика похожа.
Если вы не хотите изобретать велосипед, вы также можете проверить [AssocVector][1]
у Александреску. Александреску в основном портировал интерфейсы std::set
и std::map
через std::vector
:
- потому что быстрее для небольших наборов данных
- потому что это может быть быстрее для замороженных наборов данных
Несортированные контейнеры
На самом деле, если вы действительно не заботитесь о порядке и ваша коллекция довольно большая, тогда unordered_set
будет быстрее, особенно потому, что целые числа так тривиальны для хеша size_t hash_method(int i) { return i; }
.
Это может работать очень хорошо ... если только вы не столкнулись с коллекцией, которая каким-то образом вызывает много коллизий, потому что тогда несортированные контейнеры будут искать в списке "коллизий" данного хэша за линейное время.
Заключение
Просто попробуйте отсортированный std::vector
подход и boost::unordered_set
подход с "реальным" набором данных (и всеми оптимизациями на нем) и выберите тот, который даст вам лучший результат.
К сожалению, мы не можем больше помочь, потому что это сильно зависит от размера набора данных и перераспределения его элементов