2

std :: mapを持っているとき、同時に:へのエレガントな方法はありますか?

  1. キーを指定して要素を挿入/編集します
  2. 挿入された要素へのイテレータを取得します

マップで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

これらの両方を1つのステートメント/行で実行することは可能ですか?ありがとう

4

4 に答える 4

4

残念ながら、STL関数とコンテナーは必ずしも期待どおりに機能するとは限りません。これが2つの一般的なバージョンです。最初のバージョンは上記のコードに似ています。

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 );
}
于 2012-04-13T20:40:40.117 に答える
1

あなたができること:

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

明らかに、の2番目の値make_pairは関係ありません(正しいタイプである限り)。ここでは、イテレータが指す値を5に設定します。

少し生意気であるために、技術的にはこれも1つのステートメントになります。

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

コンマ(,)演算子は、rhsが評価される前にすべての副作用が発生することを保証するためiter、正しい値になります。

于 2012-04-13T20:33:42.860 に答える
1

ペアではなく値だけが必要な場合:

int& value = myMap[0] = 0;
于 2012-04-13T21:22:45.417 に答える
0
myMap[0] = 0;

この行は、キーが存在しない場合はキー0の値を挿入し、いずれの場合もそのキーの値を0に設定します。

これはあなたが持っていたものとほぼ同じで、1行にすることができます:

myMap.insert(std::make_pair(0,0)).first->second = 0;
于 2012-04-13T20:20:12.683 に答える