C++映射中,找到第一个小于键的元素

C++ map, find the first element that is less than key

本文关键字:小于 元素 第一个 映射 C++      更新时间:2023-10-16

我目前正在寻找一种类似于C++中的map的数据结构。

我正在寻找一个可以返回第一个元素的函数,该元素立即小于某个数字。 例如:

map<int,int> m;
m[1] ++;
m[2] ++;
m[4] ++;
m[5] ++;
find_first_element_less_than(3) ----> return 2; 
m.upper_bound(3) ---> return 4; 

我已经查看了lower_bound函数。但是,它说它返回的第一个元素不小于键。在本例中,lower_bound(3) 返回 4。这不是我想要的。

我想知道C++是否有任何数据结构可以为我做到这一点?


UpdatE:

我可以做auto it = m.lower_bound(3); if (it != m.begin()) it--;吗?

我认为您可以通过反转地图的顺序(map<int,int, std::greater<int> > m;),然后使用upper_bound找到第一个项目"更大"(但实际上更少,因为你颠倒了谓词)比请求的项目"更大"(但实际上更少,因为你颠倒了谓词)。如果你需要按升序迭代,你将不得不使用反向迭代器,这可能会让维护者(包括你自己)有点困惑。仔细考虑您对这种可能的解决方案的需求。

您可以找到下限,如果迭代器不指向映射的开头,则将迭代器递减 1。

lower_bound返回一个迭代器,指向第一个不小于(即大于或等于)键的元素。 因此,最好使用upper_bound并始终减少迭代器:

int find_first_element_less_than(int val)
{
auto uppper_node = m.upper_bound(val);
if (uppper_node != m.begin())
uppper_node--;
return upuppper_node->second;
}