如何更新矢量或地图的值
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->pRule->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, );
真的很难猜出你的程序做了什么,因为你没有给出任何上下文,但是(假设你的case
s 都应该是第一个的重复,因为你谈到了“迭代”)这就是我想要的做:
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;
【讨论】:
以上是关于如何更新矢量或地图的值的主要内容,如果未能解决你的问题,请参考以下文章