stl::mapを使用して、値を持つキーを格納しています。私のアプリでは、現在の値が前の値よりも大きい場合にのみ、キーの値を変更する必要があります。これを行うには、 find()を呼び出してキーが既にマップにあるかどうかを検索し、その値を変更します。それ以外の場合は、insert()を呼び出して新しいキーを保存します。このようなことを効率的に行う方法はありますか?または、値にカスタム制約を指定してinsert()のみを呼び出すには?
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
指定し、順序付けられました)
于 2012-10-07T08:27:25.617 に答える