upper_bound反向迭代器使用异常:为何输出结果差异巨大?
为什么两段代码输出不同?
这核心原因是两段代码都违反了upper_bound的使用前提,触发了C++中的「未定义行为」——未定义行为的结果完全不可预测,可能输出垃圾值、容器内元素甚至导致程序崩溃,两次输出不同只是这种不确定性的体现。
具体拆解:
upper_bound要求传入的迭代器范围必须是已排序的(默认按less<T>规则,也就是升序排列),否则函数行为没有任何保证。- 你使用了反向迭代器
rbegin()/rend(),相当于把原容器的逆序作为遍历范围:- 第一段代码的容器是
{0,1,3,2},逆序为{2,3,1,0},这个序列明显不是升序,upper_bound在乱序范围上运行后,返回的迭代器可能指向了rend()(反向迭代器的末尾,对应原容器第一个元素的前一个位置,属于容器外的非法内存),解引用它就得到了随机垃圾值(比如你看到的24576)。 - 第二段代码的容器是
{0,1,3,2,2},逆序为{2,2,3,1,0},同样是乱序的,upper_bound行为依然未定义,只是这次刚好返回了指向容器内某个2的迭代器,所以输出了2。
- 第一段代码的容器是
如果想让upper_bound在反向迭代器下正确工作,需要保证反向遍历的范围符合排序要求,或者传入对应的比较函数。比如原容器是升序时,想用反向迭代器找第一个小于value的元素,就需要传入greater<int>()作为比较参数。
内容的提问来源于stack exchange,提问作者mingzi xingshi
相关产品推荐
相关产品推荐

