目前,我的解决方案是迭代Map来解决这个问题。我看到有一个upper_bound方法可以使这个循环更快,但是有没有更快或更简洁的方法呢?
upper_bound
pdtvr36n1#
结尾:
m.rbegin();
Maps(和集合)是排序的,所以第一个元素是最小的,最后一个元素是最大的。默认情况下,Map使用std::less,但是你可以切换比较器,这当然会改变最大元素的位置。(例如,使用std::greater会将其放置在begin()。)记住rbegin返回一个迭代器,要得到实际的键,使用m.rbegin()->first,为了清晰起见,你 * 可能 * 会把它 Package 成一个函数,尽管我不确定是否值得:
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);
jtw3ybtb2#
在std::map中的条目是排序的,所以对于std::map m(假设m.empty()为假),你可以很容易地得到最大的键:(--m.end())->first
m.empty()
(--m.end())->first
rsl1atfo3#
由于标准::map是一个关联数组,所以可以很容易地找到最大或最小的键。默认情况下,比较函数是less(〈)操作符,所以最大的键将是map中的最后一个元素。类似地,如果有人有不同的要求,任何人都可以在声明map时修改比较函数。std::map〈键,值,比较〈键,值〉〉默认比较=std::less
u5rb5r594#
因为你没有使用unordered_map,你的键应该是有序的,根据你想用迭代器做什么,你有两个选择:1.如果你想要一个forwards-iterator,那么你可以使用std::prev(myMap.end()),注意--myMap.end()不能保证在所有的场景下都能工作,所以我通常会避免使用它。1.如果要反向迭代,则使用myMap.rbegin()
std::prev(myMap.end())
--myMap.end()
myMap.rbegin()
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
5条答案
按热度按时间pdtvr36n1#
结尾:
Maps(和集合)是排序的,所以第一个元素是最小的,最后一个元素是最大的。默认情况下,Map使用
std::less
,但是你可以切换比较器,这当然会改变最大元素的位置。(例如,使用std::greater
会将其放置在begin()
。)记住
rbegin
返回一个迭代器,要得到实际的键,使用m.rbegin()->first
,为了清晰起见,你 * 可能 * 会把它 Package 成一个函数,尽管我不确定是否值得:jtw3ybtb2#
在std::map中的条目是排序的,所以对于std::map m(假设
m.empty()
为假),你可以很容易地得到最大的键:(--m.end())->first
rsl1atfo3#
由于标准::map是一个关联数组,所以可以很容易地找到最大或最小的键。默认情况下,比较函数是less(〈)操作符,所以最大的键将是map中的最后一个元素。类似地,如果有人有不同的要求,任何人都可以在声明map时修改比较函数。
std::map〈键,值,比较〈键,值〉〉
默认比较=std::less
u5rb5r594#
因为你没有使用unordered_map,你的键应该是有序的,根据你想用迭代器做什么,你有两个选择:
1.如果你想要一个forwards-iterator,那么你可以使用
std::prev(myMap.end())
,注意--myMap.end()
不能保证在所有的场景下都能工作,所以我通常会避免使用它。1.如果要反向迭代,则使用
myMap.rbegin()
4nkexdtk5#
因为Map只是一个AVL树,所以它是按升序排序的,所以键最大的元素是最后一个元素,你可以用下面两种方法之一得到它:
1.