【问题标题】:modify value of key in boost unordered_map修改 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。您只是在修改恰好存储在地图中的向量。您不是在修改地图的键,而是其中一个值。

标签: c++ boost unordered-map


【解决方案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] 会创建该元素。
      猜你喜欢
      • 1970-01-01
      • 2012-10-07
      • 2013-05-04
      • 1970-01-01
      • 2013-08-10
      • 2012-08-29
      • 2011-05-16
      • 1970-01-01
      • 2013-02-06
      相关资源
      最近更新 更多