C++ 修改boost无序映射中键的值
我有一个boost::unordered_映射,我想修改一个特定键的值。 我已经看到了这个问题 使我的问题不同的是,在我的映射中,键是一个简单的int,值是std::vector。我想通过在向量的第二个位置插入一个新的POITCORD来更新这个值 一种解决方案是: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
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]会创建该元素。