Прежде всего, вы можете поискать Boost :: MultiIndex и / или Boost :: bimap .Любой из них, вероятно, немного поможет в вашей ситуации, когда вы захотите использовать один из парных элементов для поиска другого (bimap - это более прямое, чем вы хотите, но если вам может понадобиться добавить третий, четвертый и т. Д. Ключ, тогдаMultiIndex может работать лучше).В качестве альтернативы вы можете просто использовать пару отсортированных векторов.В таких ситуациях, когда данные остаются постоянными после их заполнения, они, как правило, позволяют быстрее выполнять поиск и потреблять меньше памяти.
Оттуда (даже если вам не нужно делать это явно), вы можетеобрабатывать инициализацию самого объекта карты немного как синглтон - поместите данные в первый раз, когда это необходимо, и с тех пор просто используйте их:
class Mapping {
static map<string, string> x;
static bool inited;
public:
Mapping() {
if (!inited) {
x["a"] = "one";
x["b"] = "two";
x["c"] = "three";
inited = true;
}
}
string getValue(string const &key) { return x[key]; }
};
// This initialization is redundant, but being explicit doesn't hurt.
bool Mapping::inited = false;
map<string, string> Mapping::x;
С этим ваш some_func
может выглядеть как-токак это:
string some_func(string const &input) {
return Mapping().getValue(input);
}
Это все еще имеет небольшие издержки по сравнению с предварительным созданием и использованием объекта, но это должно быть намного меньше, чем повторное создание и повторная инициализациякарта (или что угодно) каждый раз.