我有一个boost :: unordered_map,我想修改特定键的值。 我看到了问题here。
是什么让我的问题与众不同的是,我的map键是一个简单的int,我的值是std :: vector。我想通过在向量的第二个位置插入一个新的PoitCoord来更新这个值。
一个解决方案是这样的:
auto it = map.find(key);
if(it != map.end())
{
std::vector<PointCoord> pntcrds = it->second;
pntcrds.insert((pntcrds.begin()+1), new_value);
it->second = pntcrds;
}
我想知道是否有更简洁的解决方案。
答案 0 :(得分:2)
如果我正确理解您的问题,地图与您的插入没有任何关系。您只是在地图中修改恰好存储的矢量。您没有修改地图的键,而是其中一个值。
所以简短的解决方案是:
auto it = map.find(key);
if(it != map.end() && !it->second.empty() )
{
it->second.insert( (pntcrds.begin()+1), new_value);
}
如果您知道地图中存在该密钥,则可以将其缩短为:
std::vector<PointCords> & pntCords = map[key];
if( ! pntCords.empty() )
pntCords.insert( pntCords.begin()+1, new_value );
注意:如果您使用第二种方法且密钥尚不存在,则会将默认构造(=空)std::vector<PointCords>
插入到地图中。
答案 1 :(得分:1)
您必须找到密钥迭代位置,然后通过
直接更新找到的密钥it->second.insert( (pntcrds.begin()+1), new_value);
但你必须确定你已经找到了迭代,并且@Johannes说你的向量不是空的。
答案 2 :(得分:1)
确实有一个非常简单的解决方案,涵盖了您可能会考虑的所有方案。它是
myMap[key].insert(pntcrds.begin()+1);
如果密钥不存在,则会插入密钥。否则,该值将更新为新值;
但是必须确保您的向量中至少有一个元素。否则,它会崩溃。
类似的伎俩是
myMap[key].push_back(new_value); // appends to the end of the vector