CMPH может быть то, что вы ищете. В основном это gperf
без , требующего установки во время компиляции.
Хотя, конечно, std::unordered_map
, как в C ++ 11, тоже может быть, хотя, возможно, с несколькими коллизиями.
Так как вы ищите строки, для строк, три (любые из трех разновидностей трия, крит-бит или любые другие прикольные имена, которые они имеют) также стоит посмотреть, особенно если у вас много из них. Существует множество бесплатных реализаций trie.
Преимущество попыток заключается в том, что они могут индексировать строки сжатия, поэтому они используют меньше памяти, что повышает вероятность хранения данных в кеше. Кроме того, шаблон доступа менее случайный, который также является дружественным к кешу. Хеш-таблица должна хранить значение плюс хеш-код и более или менее случайным образом индексируется (не случайно , но непредсказуемо) в памяти. Три-подобная структура в идеале нуждается только в одном дополнительном бите, который отличает ключ от его общего префикса в каждом узле.
(Заметьте, кстати, что O (log (N)) вполне может быть быстрее, чем O (1) в таком случае, потому что big-O не считает такие вещи.)