В интерпретаторе для моего экспериментального языка программирования у меня есть таблица символов. Каждый символ состоит из имени и значения (значение может быть, например, типа string, int, function и т. д.).
Сначала я представлял таблицу вектором и перебирал символы, проверяя, подходит ли данное имя символа.
Тогда я решил использовать карту, в моем случае map<string,symbol> это было бы лучше, чем постоянно повторять вектор, но:
Немного сложно объяснить эту часть, но я попытаюсь.
Если переменная извлекается в программе на моем языке впервые, конечно, ее положение в таблице символов должно быть найдено (теперь с использованием вектора). Если бы я повторял вектор каждый раз, когда выполняется строка (подумайте о цикле), это было бы ужасно медленно (как сейчас, почти так же медленно, как пакет Microsoft).
Так что я мог бы использовать карту для получения переменной: SymbolTable[ myVar.Name ]
Но подумайте о следующем: если переменная, все еще использующая вектор, найдена в первый раз, я могу сохранить ее точную целочисленную позицию в векторе вместе с ней. Это означает: в следующий раз, когда это понадобится, мой интерпретатор знает, что он был «кэширован», и не ищет его в таблице символов, а делает что-то вроде SymbolTable.at( myVar.CachedPosition ).
Теперь мой (довольно сложный?) вопрос:
Должен ли я использовать вектор для таблицы символов вместе с кэшированием положения переменной в векторе?
Должен ли я использовать карту? Почему? Насколько быстро работает оператор []?
Должен ли я использовать что-то совершенно другое?