为何multiset gquiz1的upper_bound值小于指定key值?
关于multiset::upper_bound在不同排序规则下的行为解释
先明确核心:upper_bound的判断逻辑完全绑定容器自身的排序比较函数,不是固定的“找大于key的元素”,而是根据比较函数定义的规则来定位。
1. 默认升序multiset(less)的行为
默认multiset<int>用less<int>排序,元素从小到大排列。此时upper_bound(40)的作用是找第一个满足40 < *it的元素——也就是第一个数值上大于40的元素。哪怕插入多个重复的50(比如容器是{30,40,40,50,50}),upper_bound(40)依然指向第一个50,因为它是第一个比40大的元素,符合你观察到的结果。
2. 降序multiset(greater)的行为
当用greater<int>作为排序谓词时,元素从大到小排列(比如容器是{50,40,30,20})。此时upper_bound(40)的判断逻辑变成找第一个满足40 > *it的元素——也就是第一个数值上小于40的元素。所以调用upper_bound(40)会返回指向30的迭代器,这就是你看到“返回小于key的值”的原因。
如果降序容器里有重复的40(比如{50,40,40,30}),upper_bound(40)还是会指向30,因为30是第一个满足40>30的元素,重复的40并不触发这个条件。
本质上,upper_bound的通用逻辑是:返回第一个让comp(key, *it)为真的元素,其中comp是容器的排序比较函数:
- 用
less<int>时,comp(key, *it)等价于key < *it,找比key大的元素; - 用
greater<int>时,comp(key, *it)等价于key > *it,找比key小的元素。
内容的提问来源于stack exchange,提问作者Electronics Pitara
相关产品推荐
相关产品推荐

