如何更新向量或地图的值

问题描述 投票:0回答:2

有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;
    }

}
c++ algorithm dictionary vector
2个回答
3
投票

是,这里有您不需要做的工作。

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;
        }
    }
}

现在,我假设实际上您稍后会使用此地图,否则将所有这些元素都保留在外面的逻辑实际上没有任何意义。


2
投票

一个选项是使点火自动映射。之后,您有正确的号码,为什么不使用它?

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;
}

}

© www.soinside.com 2019 - 2024. All rights reserved.