修改 boost unordered_map 中键的值
Posted
技术标签:
【中文标题】修改 boost unordered_map 中键的值【英文标题】:modify value of key in boost unordered_map 【发布时间】:2014-11-03 13:02:24 【问题描述】:我有一个 boost::unordered_map 我想修改一个特定键的值。 我看到了here的问题。
让我的问题与众不同的是,在我的地图键中是一个简单的 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;
我想知道是否有不那么冗长的解决方案。
【问题讨论】:
it->second.insert( (pntcrds.begin()+1), new_value);
?但是,您应该确保向量不为空。
请发布可编译的代码,您有错别字。而且您永远不会修改密钥。为什么要在第二个位置插入?
根据我使用的算法需要插入第二个位置。
@JohannesS。是否可以通过调用map本身直接插入?
好吧,地图与插入无关,IIUC。您只是在修改恰好存储在地图中的向量。您不是在修改地图的键,而是其中一个值。
【参考方案1】:
如果我正确理解您的问题,该地图与您的插入无关。您只是在修改恰好存储在地图中的向量。您不是在修改地图的 key,而是其中一个 values。
所以简短的解决方案是:
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 );
注意:如果您使用第二种方法并且密钥尚不存在,则会将默认构造的(=empty)std::vector<PointCords>
插入到映射中。
【讨论】:
【参考方案2】:你必须找到关键的迭代位置,然后直接更新找到的关键
it->second.insert( (pntcrds.begin()+1), new_value);
但你必须确保你已经找到了迭代,正如@Johannes 所说,你的向量不为空。
【讨论】:
【参考方案3】:确实有一个非常简单的解决方案,涵盖了您可能想到的所有场景。它是
myMap[key].insert(pntcrds.begin()+1);
如果密钥不存在,它将被插入。否则,该值将更新为新值;
但您必须确保您的向量中至少有一个元素。否则会崩溃。
类似的技巧是
myMap[key].push_back(new_value); // appends to the end of the vector
【讨论】:
如果key不存在,则插入;否则,容器将保持不变。 @JamesKanze No: ideone.com/HWYO57operator[]
返回一个非常量引用,当然可以修改。就我而言,push_back()
或 insert()
我的错。我看到了insert
,想到了std::map<>::insert
。如果元素不存在,myMap[key]
会创建该元素。以上是关于修改 boost unordered_map 中键的值的主要内容,如果未能解决你的问题,请参考以下文章
boost::unordered_map 中以结构为键的 boost 变体
指定构造 boost::unordered_map 时的最小桶数
如何使用 boost std::vector of boost::unordered_map 进行序列化/反序列化