Да, здесь есть нагрузки, которые вам не нужны.
switch (pSeg->pRule->Num_RealSpeedLimit)
{
case 10:
auto search = speedLimitMap.find(10);
Зачем повторять 10
? У вас уже есть переменная !
auto search = speedLimitMap.find(pSeg->pRule->Num_RealSpeedLimit);
Теперь вообще нет необходимости в switch
, поскольку он будет выполняться одинаково для всех этих чисел.
У вас также есть ошибка в том, что вы не используете итератор, полученный с помощью .find
, а просто модифицируете локальную переменную validSpeedLimit
, которую вы скопировали в каждый элемент карты. Я предполагаю, что это неправильно.
Дальнейшее улучшение вашего .insert
действительно, но многословно. Вместо этого вы можете использовать одно из следующих:
speedLimitMap.emplace(10, validSpeedLimit));
speedLimitMap[10] = validSpeedLimit;
Поскольку validSpeedLimit
создается по умолчанию, нам даже не нужны все эти копии; просто default-construct на месте:
speedLimitMap.emplace(10, {});
Трудно догадаться, что делает ваша программа, потому что вы не указали контекст, но (при условии, что все ваши case
должны повторяться первое, так как вы говорили об «итерациях») вот что я сделаю:
auto& rule = *pSeg->pRule;
if (rule.b_IsRealSpeedLimitValid)
{
static constexpr const int keys[] = {
10, 20, 30, 350, 40, 50, 60, 70, 80, 90, 100, 110
};
for (const auto i : keys)
speedLimitMap.emplace(i, {});
if (rule.Num_RealSpeedLimit)
{
if (auto it = speedLimitMap.find(rule.Num_RealSpeedLimit); it != speedLimitMap.end())
{
auto& validSpeedLimit = it->second;
++validSpeedLimit.totalSegmentCount;
validSpeedLimit.isValid = true;
segLength += validSpeedLimit.totalSegmentLength;
}
}
}
Теперь я предполагаю, что в действительности вы используете эту карту позже, в противном случае логика c хранить все эти элементы на самом деле не имеет никакого смысла.