我试图使自己熟悉C ++中的映射,并且还试图理解可以在其上使用的一些基本操作。但是,我唯一不了解的两个是lower_bound()
和upper_bound()
。我已经多次查询了他们,但不知道他们在做什么。有人可以澄清一下吗?
答案 0 :(得分:2)
下限和上限可能更容易理解为equal_range
。
equal_range
返回一对迭代器,当将其视为半开间隔时,它们是与传入键等效的值(在<
下)。
一旦您掌握了这一点,lower_bound
将返回equal_range
的第一个“开始”迭代器,而upper_bound
返回equal_range
的最后一个“结束后的一个”迭代器。
直接指定它们会导致您的尴尬阅读:“第一个元素不少于”等。在他们的正确思维中,没有人以这种方式思考它们,除非在狭窄的情况下。
答案 1 :(得分:0)
要了解lower_bound
/ upper_bound
,您必须记住map
不仅是将键映射到值的容器,而且像真实词汇一样,它也强制按键对元素进行排序,因此您不仅会对查找特定项目感兴趣,而且会对快速找到可能实际上不存在的某些键的“周围环境”感兴趣。
假设您有一个map<string, T>
,它将字典中的单词映射到其他单词。如果您想使用前缀匹配(例如,所有以“ dange”开头的单词),请使用lower_bound
,这将为您返回大于或等于给定值的第一项;从字典上比较,所有以该前缀开头的单词都将满足此条件(因此,您可能会得到一个指向“危险”的迭代器)。现在,只要前缀匹配(“ danger”,“ dangerous”,...),您就可以向前迭代。
另一个示例:您有一个从时间戳到事件的映射,并且您想查找两个时间戳之间发生的情况。您可以使用lower_bound
来查找比初始时间戳记更早的第一个元素>=
,即使该时间戳记实际上不与任何存储的事件相对应(因此find
也不会),并且然后只要您在自己感兴趣的范围内就可以前进。
upper_bound
可以完成类似的示例-尽管老实说,我认为我很少使用它。