3

stl::mapを使用して、値を持つキーを格納しています。私のアプリでは、現在の値が前の値よりも大きい場合にのみ、キーの値を変更する必要があります。これを行うには、 find()を呼び出してキーが既にマップにあるかどうかを検索し、その値を変更します。それ以外の場合は、insert()を呼び出して新しいキーを保存します。このようなことを効率的に行う方法はありますか?または、値にカスタム制約を指定してinsert()のみを呼び出すには?

4

3 に答える 3

4

以下のように、std :: mapの挿入オーバーロードの1つは、ノードへのイテレータとブール値を含むペアを返します。ブール値は、挿入が成功したか、または重複があったかを示します。falseの場合は、イテレータを使用して値を手動で更新するだけです。

#include <iostream>
#include <string>
#include <map>

int main()
{
  typedef std::map<std::string, int> TestMap;
  TestMap test;
  test.insert(std::make_pair("one", 1));

  std::pair<TestMap::iterator, bool> result =
      test.insert(std::make_pair("one", 2));

  if (!result.second)
  {
    // was a duplicate, so let's manually set the value on the existing
    // map entry

    result.first->second = 2;
  }

  std::cout << test.at("one") << std::endl; // outputs 2
}
于 2012-10-07T08:34:57.527 に答える
2

T newval新しい値が以前のT oldval値以上であり、それ以上の値のみを使用する場合にマップを更新する必要がある場合は、T()非常に簡単です。

myMap[key] = std::max(myMap[key],newval);

std::map::operator[]マップ内の要素への参照を返します。これは、既存の要素または新しく構築された既定の要素 (myMap[key] == T()) のいずれかになります。

このソリューションはstd::map::insert舞台裏で使用されますが、負でない値のみを使用する場合は少し読みやすいことに注意してください。

于 2012-10-07T08:52:32.827 に答える
-1

lower_bound要素を検索するために呼び出します。存在しない場合は、次に大きいキーが提供されます。キーが存在しない場合は、イテレータを使用して 1 ステップ戻り、指定されinsertたパラメーターを使用して呼び出すことができますposition。これにより、挿入する正しい位置を検索する時間が短縮されます (正しい位置をmap指定し、順序付けられました)

http://www.cplusplus.com/reference/stl/map/insert/

于 2012-10-07T08:27:25.617 に答える