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
returns 一对迭代器,当被视为半开区间时,它们是等价于(在 <
下)您传入的键的值.
一旦你掌握了这一点,lower_bound
returns equal_range
的第一个 "starting" 迭代器和 upper_bound
returns 最后一个 [=26] =] equal_range
.
的结束迭代器
直接指定它们会导致阅读时出现尴尬,您可能对以下内容感到困惑:"the first element not less than" 等。除了在狭隘的情况下,头脑正常的人不会那样想它们。
要理解 lower_bound
/upper_bound
,您必须记住 map
不仅仅是将键映射到值的容器,而且就像现实世界的词汇表一样,它还强制元素按键排序,因此您不仅可以对查找特定项目感兴趣,而且可以快速定位某些实际上可能不存在的键的 "surroundings"。
假设您有一个 map<string, T>
,它将字典中的单词映射到其他内容。如果您想要前缀匹配(例如,所有以 "dange" 开头的单词),请使用 lower_bound
,这将 return 您第一个大于或等于给定值的项目;所有以该前缀开头的单词,按字典顺序进行比较,都将满足此标准(因此您可能会得到一个指向 "danger" 的迭代器)。只要前缀匹配 ("danger", "dangerous", ...).
,您现在就可以向前迭代
另一个例子:你有一个从时间戳到事件的映射,你想查找两个时间戳之间发生了什么。您可以使用 lower_bound
来定位第一个元素 >=
而不是初始时间戳,即使这样的时间戳实际上并不对应于任何存储的事件(因此 find
不会),并且然后一直往前走,只要在你感兴趣的范围内。
类似的例子可以用 upper_bound
完成——尽管老实说我认为我很少使用它。
我正在尝试熟悉 C++ 中的映射,并且我也在尝试了解可以在它们上使用的一些基本操作。然而,我唯一不明白的两个是 lower_bound()
和 upper_bound()
。我已经多次查找它们,但不明白它们在做什么。有人可以澄清一下吗?
下限和上限可能更容易理解为 equal_range
。
equal_range
returns 一对迭代器,当被视为半开区间时,它们是等价于(在 <
下)您传入的键的值.
一旦你掌握了这一点,lower_bound
returns equal_range
的第一个 "starting" 迭代器和 upper_bound
returns 最后一个 [=26] =] equal_range
.
直接指定它们会导致阅读时出现尴尬,您可能对以下内容感到困惑:"the first element not less than" 等。除了在狭隘的情况下,头脑正常的人不会那样想它们。
要理解 lower_bound
/upper_bound
,您必须记住 map
不仅仅是将键映射到值的容器,而且就像现实世界的词汇表一样,它还强制元素按键排序,因此您不仅可以对查找特定项目感兴趣,而且可以快速定位某些实际上可能不存在的键的 "surroundings"。
假设您有一个 map<string, T>
,它将字典中的单词映射到其他内容。如果您想要前缀匹配(例如,所有以 "dange" 开头的单词),请使用 lower_bound
,这将 return 您第一个大于或等于给定值的项目;所有以该前缀开头的单词,按字典顺序进行比较,都将满足此标准(因此您可能会得到一个指向 "danger" 的迭代器)。只要前缀匹配 ("danger", "dangerous", ...).
另一个例子:你有一个从时间戳到事件的映射,你想查找两个时间戳之间发生了什么。您可以使用 lower_bound
来定位第一个元素 >=
而不是初始时间戳,即使这样的时间戳实际上并不对应于任何存储的事件(因此 find
不会),并且然后一直往前走,只要在你感兴趣的范围内。
类似的例子可以用 upper_bound
完成——尽管老实说我认为我很少使用它。