有12个速度限制。我想作一个统计,将它们分开计算。如何更新它们?我不想每次迭代都推送一个新元素。我只想在每次迭代时更新它们的值。有没有比我更好的方法?我开始像这样编码:
if (pSeg->pRule->b_IsRealSpeedLimitValid)
{
realSpeedLimit validSpeedLimit;
speedLimitMap.insert(std::pair<int, realSpeedLimit>(10, validSpeedLimit));
speedLimitMap.insert(std::pair<int, realSpeedLimit>(20, validSpeedLimit));
speedLimitMap.insert(std::pair<int, realSpeedLimit>(30, validSpeedLimit));
speedLimitMap.insert(std::pair<int, realSpeedLimit>(35, validSpeedLimit));
speedLimitMap.insert(std::pair<int, realSpeedLimit>(40, validSpeedLimit));
speedLimitMap.insert(std::pair<int, realSpeedLimit>(50, validSpeedLimit));
speedLimitMap.insert(std::pair<int, realSpeedLimit>(60, validSpeedLimit));
speedLimitMap.insert(std::pair<int, realSpeedLimit>(70, validSpeedLimit));
speedLimitMap.insert(std::pair<int, realSpeedLimit>(80, validSpeedLimit));
speedLimitMap.insert(std::pair<int, realSpeedLimit>(90, validSpeedLimit));
speedLimitMap.insert(std::pair<int, realSpeedLimit>(100, validSpeedLimit));
speedLimitMap.insert(std::pair<int, realSpeedLimit>(110, validSpeedLimit));
switch (pSeg->pRule->Num_RealSpeedLimit)
{
case 10:
auto search = speedLimitMap.find(10);
if (search != speedLimitMap.end())
{
++validSpeedLimit.totalSegmentCount;
validSpeedLimit.isValid = true;
segLength += validSpeedLimit.totalSegmentLength;
}
break;
case 20:
break;
case 25:
break;
case 30:
break;
case 40:
break;
case 50:
break;
case 60:
break;
case 70:
break;
case 80:
break;
case 90:
break;
case 100:
break;
case 110:
break;
default:
break;
}
}
是,这里有您不需要做的工作。
switch (pSeg->pRule->Num_RealSpeedLimit)
{
case 10:
auto search = speedLimitMap.find(10);
为什么重复10
?您已经将它放在variable!
auto search = speedLimitMap.find(pSeg->pRule->Num_RealSpeedLimit);
现在完全不需要switch
,因为对于所有这些数字都将执行相同的操作。
您还有一个错误,因为您不是使用通过.find
获得的迭代器,而只是修改了复制到每个map元素中的局部变量validSpeedLimit
。我认为这是错误的。
.insert
的进一步改进是有效的,但冗长。您可以改用以下任一方法:
speedLimitMap.emplace(10, validSpeedLimit));
speedLimitMap[10] = validSpeedLimit;
由于validSpeedLimit
是默认构造的,所以我们实际上甚至不需要所有这些副本;只是就地默认构造:
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;
}
}
}
现在,我假设实际上您稍后会使用此地图,否则将所有这些元素都保留在外面的逻辑实际上没有任何意义。
一个选项是使点火自动映射。之后,您有正确的号码,为什么不使用它?
if (pSeg->pRule->b_IsRealSpeedLimitValid) {
realSpeedLimit validSpeedLimit;
for (unsigned int i = 1; i <= 12; ++i) {
speedLimitMap.insert(std::pair<int, realSpeedLimit>(i*10, validSpeedLimit));
}
auto search = speedLimitMap.find(pSeg->pRule->Num_RealSpeedLimit);
if (search != speedLimitMap.end()) {
++validSpeedLimit.totalSegmentCount;
validSpeedLimit.isValid = true;
segLength += validSpeedLimit.totalSegmentLength;
} else {
std::cerr << "Your number: " << pSeg->pRule->Num_RealSpeedLimit<< " not in database" << std::endl;
}
}