web-dev-qa-db-ja.com

C ++ std :: mapで最大のキーを見つける方法は?

現在のところ、私の解決策は、これを解決するためにマップを反復処理することです。

upper_boundこのループを高速化できるメソッドですが、より速くまたはより簡潔な方法はありますか?

41
gak

終わり:

_m.rbegin();
_

マップ (およびセット)はソートされるため、最初の要素が最小で、最後の要素が最大です。デフォルトでは、マップは _std::less_ を使用しますが、比較演算子を切り替えることができます。これにより、もちろん最大の要素の位置が変更されます。 (たとえば、 _std::greater_ を使用すると、begin()に配置されます。

rbeginはイテレータを返すことに注意してください。実際のキーを取得するには、m.rbegin()->firstを使用します。あなたmightは、明確にするために関数にラップしますが、価値があるかどうかはわかりません。

_template <typename T>
inline const typename T::key_type& last_key(const T& pMap)
{
    return pMap.rbegin()->first;
}

typedef std::map</* types */> map_type;

map_type myMap;
// populate

map_type::key_type k = last_key(myMap);
_
107
GManNickG

Std :: mapのエントリは並べ替えられるため、std :: map m(m.empty()がfalseであると想定)の場合、最大のキーを簡単に取得できます:(--m.end())->first

12
user200783

Std :: mapは連想配列なので、最大または最小のキーを簡単に見つけることができます。デフォルトでは、比較関数はless(<)演算子なので、最大のキーはマップの最後の要素になります。同様に、誰かが異なる要件を持っている場合、誰でもマップを宣言しながら比較関数を変更できます。

std :: map <key、Value、compare <key、Value>>

デフォルトでは、compare = std :: less

0
Vivek