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