目前我的解决方案是迭代地图来解决这个问题。
我看到有一个upper_bound
方法可以让这个循环更快,但是有更快或更简洁的方法吗?
答案 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
largestElement = (--myMap.end())->first; // end(): returns an iterator pointing to the theortical element following the last element