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

30byixjq  于 2023-02-26  发布在  其他
关注(0)|答案(5)|浏览(526)

目前,我的解决方案是迭代Map来解决这个问题。
我看到有一个upper_bound方法可以使这个循环更快,但是有没有更快或更简洁的方法呢?

pdtvr36n

pdtvr36n1#

结尾:

m.rbegin();

Maps(和集合)是排序的,所以第一个元素是最小的,最后一个元素是最大的。默认情况下,Map使用std::less,但是你可以切换比较器,这当然会改变最大元素的位置。(例如,使用std::greater会将其放置在begin()。)
记住rbegin返回一个迭代器,要得到实际的键,使用m.rbegin()->first,为了清晰起见,你 * 可能 * 会把它 Package 成一个函数,尽管我不确定是否值得:

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

jtw3ybtb2#

在std::map中的条目是排序的,所以对于std::map m(假设m.empty()为假),你可以很容易地得到最大的键:(--m.end())->first

rsl1atfo

rsl1atfo3#

由于标准::map是一个关联数组,所以可以很容易地找到最大或最小的键。默认情况下,比较函数是less(〈)操作符,所以最大的键将是map中的最后一个元素。类似地,如果有人有不同的要求,任何人都可以在声明map时修改比较函数。
std::map〈键,值,比较〈键,值〉〉
默认比较=std::less

u5rb5r59

u5rb5r594#

因为你没有使用unordered_map,你的键应该是有序的,根据你想用迭代器做什么,你有两个选择:
1.如果你想要一个forwards-iterator,那么你可以使用std::prev(myMap.end()),注意--myMap.end()不能保证在所有的场景下都能工作,所以我通常会避免使用它。
1.如果要反向迭代,则使用myMap.rbegin()

4nkexdtk

4nkexdtk5#

因为Map只是一个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

相关问题