繁体   English   中英

map :: lower_bound()和map :: upper_bound在C ++中如何工作?

[英]How do map::lower_bound() and map::upper_bound work in C++?

我试图使自己熟悉C ++中的映射,并且还试图了解可以在其上使用的一些基本操作。 但是,我唯一不了解的两个是lower_bound()upper_bound() 我已经多次查询了他们,但不知道他们在做什么。 有人可以澄清一下吗?

下限和上限可能更容易理解为equal_range

equal_range返回一对迭代器,当将其视为半开间隔时,它们是与传入键等效的值(在<之下)。

一旦你掌握, lower_bound返回的第一个“开始”迭代器equal_rangeupper_bound返回最后“一个过去的结束”结尾的迭代器equal_range

直接指定它们会导致您的笨拙阅读:“第一个元素不少于”等。在他们的右脑中,没有人以这种方式思考它们,除非在狭窄的情况下。

要了解lower_bound / upper_bound您必须记住, map不仅是将键映射到值的容器,而且像现实世界中的词汇表一样,它还强制元素按键排序,因此您不仅会感兴趣查找特定项目,但快速找到可能实际上不存在的某些键的“周围环境”。

假设您有一个map<string, T> ,它将字典单词映射到其他内容。 如果您想进行前缀匹配(例如,所有以“ dange”开头的单词),请使用lower_bound ,这将为您返回大于或等于给定值的第一项; 从字典上比较,所有以该前缀开头的单词都将满足此条件(因此,您可能会得到一个指向“危险”的迭代器)。 现在,只要前缀匹配(“ danger”,“ dangerous”,...),您就可以向前迭代。

另一个示例:您有一个从时间戳到事件的映射,并且您想查找两个时间戳之间发生的情况。 您可以使用lower_bound来定位第一个>=大于初始时间戳的元素,即使该时间戳实际上并不与任何存储的事件相对应(因此find也不行),然后只要您在范围内,就可以继续前进您的兴趣。

使用upper_bound可以完成类似的示例-尽管老实说我认为我很少使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM