STL Map, поставляемая с Visual Studio 2008, будет давать вам O (log (n)) для каждого вызова функции, поскольку она скрывает древовидную структуру.
В современном компиляторе (в зависимости от реализации) оператор switch даст вам O (1), а компилятор преобразует его в какую-то таблицу поиска.
Так что, в общем, переключение происходит быстрее.
Однако , учтите следующие факты:
Разница между картой и коммутатором заключается в том, что: карта может быть построена динамически, а коммутатор - нет. Map может содержать любой произвольный тип в качестве ключа, в то время как switch очень ограничен примитивными типами c ++ (char, int, enum и т. Д.).
Кстати, вы можете использовать хеш-карту для достижения почти O (1) диспетчеризации (хотя, в зависимости от реализации хеш-таблицы, иногда это может быть O (n) в худшем случае). Несмотря на то, что переключатель все равно будет быстрее.
Редактировать
Я пишу следующее только для развлечения и для обсуждения
Я могу предложить вам хорошую оптимизацию, но это зависит от характера вашего языка и от того, можете ли вы ожидать, как будет использоваться ваш язык.
Когда вы пишете код:
Вы делите свои токены на две группы, одна из которых будет очень часто используемой, а другая - низкой. Вы также сортируете часто используемые токены.
Для высоких часто используемых токенов вы пишете серию if-else, где чаще всего используются наиболее часто используемые. для часто используемых низких значений вы пишете оператор switch.
Идея состоит в том, чтобы использовать прогнозирование ветвления ЦП, чтобы даже избежать другого уровня косвенности (предполагая, что проверка условий в операторе if практически бесплатна).
в большинстве случаев процессор выберет правильную ветвь без какого-либо уровня косвенности. Однако будет несколько случаев, когда филиал пойдет не туда.
В зависимости от характера вашего языка, статистически он может дать лучшую производительность.
Редактировать : Из-за некоторых комментариев, приведенных ниже, изменено Предложение о том, что компиляторы всегда будут переводить переключатель в LUT.