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

时间:2018-09-20 23:57:21

标签: c++ dictionary std stdmap c++-standard-library

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

2 个答案:

答案 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可以完成类似的示例-尽管老实说,我认为我很少使用它。