修改 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-&gt;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&lt;PointCords&gt; 插入到映射中。

【讨论】:

【参考方案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/HWYO57 operator[] 返回一个非常量引用,当然可以修改。就我而言,push_back()insert() 我的错。我看到了insert,想到了std::map&lt;&gt;::insert。如果元素不存在,myMap[key] 会创建该元素。

以上是关于修改 boost unordered_map 中键的值的主要内容,如果未能解决你的问题,请参考以下文章

boost::unordered_map 中以结构为键的 boost 变体

指定构造 boost::unordered_map 时的最小桶数

如何使用 boost std::vector of boost::unordered_map 进行序列化/反序列化

boost::unordered_map() 的 find() 方法的问题

Boost::unordered_map 与初始化列表?

使用 std::map/boost::unordered_map 帮助理解段错误