如何更新矢量或地图的值

Posted

技术标签:

【中文标题】如何更新矢量或地图的值【英文标题】:How can I update a value of a vector or a map 【发布时间】:2020-03-23 10:16:14 【问题描述】:

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


【问题讨论】:

这能回答你的问题吗? Accessing elements of a vector in C++? 为什么不speedLimitMap[pSeg-&gt;pRule-&gt;Num_RealSpeedLimit]++ @JasperKent 因为它是错误的,是主要缺陷 - 它默认构造不存在的元素并且递增值实际上是元素类型的成员(加上其他您不考虑的操作为了)。请在答案中提出您的技术解决方案,以便对其进行适当的同行评审以避免误传 我不确定这是否是解决方案,这就是我提出问题作为评论的原因。如果您或提问者可以解释为什么它是错误的,那么我们可能会找到解决方案。 它不默认构造对象。 switch 已经将我们限制在已经存在的元素中。 【参考方案1】:

是的,这里有一些你不需要做的事情。

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 是默认构造的,我们实际上甚至不需要所有这些副本;就地默认构造:

speedLimitMap.emplace(10, );

真的很难猜出你的程序做了什么,因为你没有给出任何上下文,但是(假设你的cases 都应该是第一个的重复,因为你谈到了“迭代”)这就是我想要的做:

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;

【讨论】:

以上是关于如何更新矢量或地图的值的主要内容,如果未能解决你的问题,请参考以下文章

如何正确清理矢量/地图?

arcgis如何加载需要矢量化的地图?

如何在c ++中将值从矢量转换为地图?

google map中影像地图是墨卡托投影,矢量地图是高斯投影,请问这两种地图是如何匹配的?

如何使用地图矢量

Cesium矢量地图插件发布新版本