То есть вы просматриваете все жетоны на вашей карте в поисках совпадений? Вы можете также использовать список или массив; это будет неэффективный поиск, независимо от того.
Гораздо более эффективным способом найти только токены, подходящие для начала или продолжения матча, было бы сохранить их как trie . Поиск там буквы даст вам поддерево, содержащее только токены, которые имеют эту букву в качестве первой буквы, а затем вы просто продолжите поиск вниз, насколько сможете.
Редактировать: позвольте мне объяснить это немного дальше.
Во-первых, я должен объяснить, что я не знаком с этими C ++ std::map
, кроме названия, что делает это прекрасным примером того, почему человек изучает теорию этого материала, а также детали конкретных библиотек в Особые языки программирования: если эта библиотека не использует название «карта» (что весьма маловероятно), само имя многое мне говорит о характеристиках структуры данных. Я знаю, например, что будет функция, которая, учитывая один ключ и карту, будет очень эффективно искать и возвращать значение, связанное с этим ключом, и что, скорее всего, есть функция, которая выдаст вам список / array / независимо от всех ключей, которые вы можете искать самостоятельно, используя свой собственный код.
Моя интерпретация вашей структуры данных заключается в том, что у вас есть карта, в которой ключи - это то, что вы называете шаблоном, ключи - это список (или массив, или что-то в этом роде) символов, а значения - токены. Таким образом, по полному шаблону вы можете быстро найти связанный с ним токен.
К сожалению, хотя такая карта хорошо подходит для преобразования вашего входного формата XML во внутреннюю структуру данных, она не очень подходит для поиска, который вам нужно выполнить. Обратите внимание, что вы просматриваете не целые шаблоны, а первый символ шаблона, производящий набор возможных токенов, за которым следует поиск второго символа шаблона из набора шаблонов, созданных этим первым поиск и т. д.
Так что вам действительно нужна не одна карта, а карты карт, каждая из которых снабжена одним символом. Поиск "p" на верхнем уровне должен дать вам новую карту с двумя ключами: p
, производящий токен C-PPA
, и "что-нибудь еще", производящий токен C-PA
. Это фактически трехуровневая структура данных.
Имеет ли это смысл?
Это может помочь, если вы сначала начнете с написания кода синтаксического анализа следующим образом: представьте, что кто-то другой напишет функции для выполнения нужных вам поисков, и он действительно хороший программист и может творить практически любую магию, которую вы хочу. При написании кода синтаксического анализа сконцентрируйтесь на том, чтобы сделать его как можно более простым и понятным, создавая любой интерфейс с использованием этих произвольных функций, которые вам нужны (не получая ничего тривиального и заменяя все это одной функцией!). Теперь вы можете посмотреть на функции поиска, с которыми вы работали, и это говорит о том, как вам нужен доступ к вашей структуре данных, что приведет вас к нужному типу структуры данных. Как только вы поняли это, вы можете решить, как его загрузить.