[英]How do map::lower_bound() and map::upper_bound work in C++?
我试图使自己熟悉C ++中的映射,并且还试图了解可以在其上使用的一些基本操作。 但是,我唯一不了解的两个是lower_bound()
和upper_bound()
。 我已经多次查询了他们,但不知道他们在做什么。 有人可以澄清一下吗?
下限和上限可能更容易理解为equal_range
。
equal_range
返回一对迭代器,当将其视为半开间隔时,它们是与传入键等效的值(在<
之下)。
一旦你掌握, lower_bound
返回的第一个“开始”迭代器equal_range
和upper_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.