C++ 修改boost无序映射中键的值

C++ 修改boost无序映射中键的值,c++,boost,unordered-map,C++,Boost,Unordered Map,我有一个boost::unordered_映射,我想修改一个特定键的值。 我已经看到了这个问题 使我的问题不同的是,在我的映射中,键是一个简单的int,值是std::vector。我想通过在向量的第二个位置插入一个新的POITCORD来更新这个值 一种解决方案是: auto it = map.find(key); if(it != map.end()) { std::vector<PointCoord> pntcrds = it->second; pntcrd

我有一个boost::unordered_映射,我想修改一个特定键的值。 我已经看到了这个问题

使我的问题不同的是,在我的映射中,键是一个简单的int,值是std::vector。我想通过在向量的第二个位置插入一个新的POITCORD来更新这个值

一种解决方案是:

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);

但是你必须确定你已经找到了迭代,正如@Johannes所说的,你的向量不是空的

您必须找到密钥迭代位置,然后通过

it->second.insert( (pntcrds.begin()+1), new_value);

但是你必须确定你已经找到了迭代,正如@Johannes所说的,你的向量不是空的

如果我正确理解您的问题,地图与您的插入没有任何关系。您只是在修改碰巧存储在地图中的向量。您不是在修改贴图的键,而是在修改其中一个值

因此,短期解决方案是:

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 );

注意:如果您使用第二种方法,并且密钥尚不存在,则将在映射中插入默认的constructed=empty std::vector。

如果我正确理解您的问题,则映射与您的插入无关。您只是在修改碰巧存储在地图中的向量。您不是在修改贴图的键,而是在修改其中一个值

因此,短期解决方案是:

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 );

注意:如果使用第二种方法,并且密钥还不存在,则会在映射中插入一个默认的constructed=empty std::vector。

确实有一个非常简单的解决方案,它涵盖了您可能想到的所有场景。的确如此

myMap[key].insert(pntcrds.begin()+1);

如果密钥不存在,将插入该密钥。否则,该值将更新为新值

但必须确保向量中至少有一个元素。否则,它将崩溃

类似的伎俩也会出现

myMap[key].push_back(new_value); // appends to the end of the vector

确实有一个非常简单的解决方案,它涵盖了您可能想到的所有场景。的确如此

myMap[key].insert(pntcrds.begin()+1);

如果密钥不存在,将插入该密钥。否则,该值将更新为新值

但必须确保向量中至少有一个元素。否则,它将崩溃

类似的伎俩也会出现

myMap[key].push_back(new_value); // appends to the end of the vector

it->second.insert pntcrds.begin+1,新的_值;?但是,您应该确保向量不是空的。请发布编译的代码,因为您有拼写错误。而且你从不修改密钥。为什么要插入第二个位置?根据我使用的算法,必须插入第二个位置。@JohannesS。可以通过调用映射本身直接插入吗?映射与插入无关,IIUC。您只是在修改碰巧存储在地图中的向量。您不是在修改映射的键,而是它的一个值。它->秒。插入pntcrds.begin+1,new_value;?但是,您应该确保向量不是空的。请发布编译的代码,因为您有拼写错误。而且你从不修改密钥。为什么要插入第二个位置?根据我使用的算法,必须插入第二个位置。@JohannesS。可以通过调用映射本身直接插入吗?映射与插入无关,IIUC。您只是在修改碰巧存储在地图中的向量。您不是在修改地图的键,而是在修改地图的某个值。如果该键不存在,将插入该键;否则,容器将保持不变。@JamesKanze No:operator[]返回一个非常量引用,当然可以修改它。在我的情况下,通过推回或插入我的坏。我看到了insert,想到了std::map::insert。如果元素不存在,myMap[key]将创建该元素。如果该键不存在,将插入该元素;否则,容器将保持不变。@JamesKanze No:operator[]返回一个非常量引用,当然可以修改它。在我的情况下,通过推回或插入我的坏。我看到了insert,想到了std::map::insert。如果元素不存在,myMap[key]会创建该元素。