[英]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.