Ваше второе решение, безусловно, должно повысить эффективность, но не является (по крайней мере, IMO) наилучшим возможным вариантом реализации. Прежде всего, это делает first_time
публично видимым, хотя на самом деле только variable_to_parameter
заботится об этом. Вы уже сделали hp
статической переменной в функции, и first_time
также должно быть.
Во-вторых, я бы не использовал указатели и / или динамическое распределение для значений HistoParameter. В одном int и двух float просто нет причин делать это. Если вы действительно так много раздаете их, что копирование стало проблемой, вам, вероятно, было бы лучше использовать некоторый класс интеллектуальных указателей вместо необработанного указателя - последний сложнее использовать и сделать намного сложнее исключение безопасно.
В-третьих, я бы подумал, стоит ли превращать variable_to_parameter в функтор вместо функции. В этом случае вы бы инициализировали карту в ctor, поэтому вам не пришлось бы проверять, инициализировалась ли она каждый раз, когда вызывался operator()
. Вы также можете объединить их, имея статическую карту в функторе. Ctor инициализирует его, если он не существует, а operator () просто выполняет поиск.
Наконец, я бы отметил, что map::operator[]
в первую очередь полезен для вставки элементов - он создает элемент с указанным ключом, если он не существует, но когда вы ищете элемент, вы обычно не Я не хочу создавать предмет. Для этого лучше использовать map.find()
.