У меня есть алгоритм который принимает вектор строк где строки это цифры английскими словами и возвращает нужную получившуюся цифру. Вот его код
using string_t = std::string;
int tokens_to_int(const std::vector<string_t>& s) {
const std::unordered_map<string_t, int> word_to_value = {
{"one", 1}, {"two", 2}, {"three", 3}, {"four", 4}, {"five", 5},
{"six", 6}, {"seven", 7}, {"eight", 8}, {"nine", 9}, {"ten", 10},
{"eleven", 11}, {"twelve", 12}, {"thirteen", 13}, {"fourteen", 14},
{"fifteen", 15}, {"sixteen", 16}, {"seventeen", 17}, {"eighteen", 18},
{"nineteen", 19}, {"twenty", 20}, {"thirty", 30}, {"fourty", 40},
{"fifty", 50}, {"sixty", 60}, {"seventy", 70}, {"eighty", 80},
{"ninety", 90}
};
const std::unordered_map<string_t, int> scale_words = {
{"hundred", 100}, {"thousand", 1000}, {"million", 1000000}, {"billion", 1000000000}
};
int scale = 1;
int rv = 0;
for (auto it = s.rbegin(); it != s.rend(); ++it) {
const string_t& cw = *it;
auto value_it = word_to_value.find(cw);
if (value_it != word_to_value.end()) {
rv += value_it->second * scale;
continue;
}
auto scale_it = scale_words.find(cw);
if (scale_it != scale_words.end()) {
scale *= scale_it->second;
}
}
return rv;
}
и теперь мне нужен алгоритм который принимает вектор строк в котором тоже строки это слова, но в этом случае это все и цифры и обычные слова. Он должен находить слова которые подходят к алгоритму tokens_to_int и добавлять их в массив и потом передавать его туда, я очень долго пытался сделать этот алгоритм, но у меня была самая большая проблема что если есть несколько чисел подряд например "four thirty one" то оно их всех брало и плюсовало и возвращало 35 хотя должно было 4 31.
Может кто-нибудь помочь?