如何更改地图中的元素并获取其位置?

时间:2012-04-13 20:16:44

标签: c++ stl std

当我有一个std :: map时,是否有一种优雅的方式同时出现:

  1. 插入/编辑给定键的元素
  2. 获取插入元素的迭代器
  3. 我发现阻止在地图中进行2次查找的最佳方法是:

    std::map<int, int> myMap;
    //do some stuff with the map
    std::map<int,int>::iterator  it = myMap.insert(std::pair<int, int>(0,0)).first;
    it->second = 0; //necessary because insert does not overwrite the values
    

    是否可以在单个语句/行中执行这两项操作? 感谢

4 个答案:

答案 0 :(得分:4)

唉,STL功能和容器并不总能达到预期效果。这是两个通用版本,第一个更像上面的代码:

template<class Map>
inline typename Map::iterator ForceInsert1( 
    Map&                           m, 
    const typename Map::key_type&  k, 
    const typename Map::data_type& d )
{
    typename Map::iterator it = m.insert( 
        typename Map::value_type( k, d ) ).first;
    it->second = d; // only necessary if the key already exists
    return it;
}

template<class Map>
inline typename Map::iterator ForceInsert2( 
    Map&                           m, 
    const typename Map::key_type&  k, 
    const typename Map::data_type& d )
{
    typename Map::iterator it = m.find( k );
    if( it != m.end() )
    {
        it->second = d;
    }
    else
    {
        it = m.insert( typename Map::value_type( k, d ) ).first;
    }
    return it;
}

typedef std::map<int, int> MyMap;
void Foo( MyMap& myMap )
{
    ForceInsert1( myMap, 42, 100 );
    ForceInsert2( myMap, 64, 128 );
}

答案 1 :(得分:1)

你可以这样做:

map<int, int> m;
map<int, int>::iterator iter;
(iter = (m.insert(make_pair(1,1))).first)->second = 5;

显然make_pair中的第二个值是无关紧要的(只要它是正确的类型)。在这里,您可以将迭代器指向的值设置为5。

有点厚颜无耻,从技术上讲,这也是一个声明:

iter = myMap.insert(make_pair(0,0)).first, iter->second = 0;

逗号(,)运算符保证在计算rhs之前发生所有副作用,因此iter具有正确的值

答案 2 :(得分:1)

如果您只想要价值而不是货币对:

int& value = myMap[0] = 0;

答案 3 :(得分:0)

myMap[0] = 0;

如果该行不存在,则该行将插入一个值为0的值,并且在任何一种情况下,它都会将该键的值设置为0.

这与你所拥有的大致类似,可以分成一行:

myMap.insert(std::make_pair(0,0)).first->second = 0;