C ++如何在std :: map中找到最大的键?

时间:2009-11-02 09:21:38

标签: c++ stl map

目前我的解决方案是迭代地图来解决这个问题。

我看到有一个upper_bound方法可以让这个循环更快,但是有更快或更简洁的方法吗?

4 个答案:

答案 0 :(得分:98)

结束:

m.rbegin();

Maps(和集合)是排序的,因此第一个元素是最小的,最后一个元素是最大的。默认情况下,地图使用std::less,但您可以切换比较器,这当然会改变最大元素的位置。 (例如,使用std::greater会将其放在begin()

请记住rbegin返回一个迭代器。要获取实际密钥,请使用m.rbegin()->first。为了清楚起见,你可能将它包装成一个函数,虽然我不确定它是否值得:

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);

答案 1 :(得分:12)

对std :: map中的条目进行排序,因此对于std :: map m(假设m.empty()为false),您可以轻松获得最大的密钥:(--m.end())->first

答案 2 :(得分:0)

由于std :: map是assosiative数组,因此很容易找到最大或最小的键。通过defualt比较函数较少(&lt;)运算符,因此最大的键将是map中的最后一个元素。同样,如果某人有不同的要求,任何人都可以在声明地图时修改比较功能。

的std ::地图&LT;键,值,比较&lt;键,值&gt; &GT;

默认情况下,比较= std :: less

答案 3 :(得分:0)

由于地图仅是一棵AVL树,因此将其按升序排序。因此,具有最大键的元素是最后一个元素,您可以使用以下两种方法之一来获取它:

1。

    largestElement = (myMap.rbegin())-> first; // rbegin(): returns an iterator pointing to the last element
  1.  largestElement = (--myMap.end())->first; // end(): returns an iterator pointing to the theortical element following the last element