如何避免std::ranges::upper_bound查询值大于容器元素时发生崩溃?
崩溃根因
你遇到的报错不是ranges::upper_bound本身的逻辑问题,而是非法解引用尾后迭代器导致的:当目标value大于已排序容器内所有元素时,ranges::upper_bound会返回容器的尾后迭代器end(),而尾后迭代器不指向任何有效元素,对其执行解引用操作*itr属于未定义行为,debug模式下会直接触发断言报错。
零额外开销规避方案
你不需要提前查找容器最大值,只要在拿到upper_bound的返回值后,先判断迭代器是否等于end()即可,该判断的时间复杂度为O(1),没有任何额外性能开销,同时还能兼容空容器的边界场景。
修正后的完整代码如下:
#include <vector> #include <iostream> #include <algorithm> using namespace std; auto main() -> int { int n, value; cin >> n; // 注意不要用vector作为变量名,和标准容器类名重名容易引发歧义错误 vector<int> vec; for (int i = 0; i < n; i++) { int a; cin >> a; vec.push_back(a); } cin >> value; ranges::sort(vec); auto itr = ranges::upper_bound(vec, value); if (itr != vec.end()) { // 迭代器有效,正常输出 cout << *itr; } else { // 所有元素均小于value,可按需自定义处理逻辑 // 示例1:输出提示信息 cout << "不存在大于value的元素"; // 示例2:如果需要取容器最大元素,直接输出 *prev(vec.end()) 即可 } return 0; }
原有临时方案的缺陷
你之前写的先判断尾元素大小的方案,除了多了一次无意义的比较之外,还存在边界漏洞:如果容器为空时直接解引用vector.end()-1也属于非法操作,反而会引入新的崩溃风险。
内容的提问来源于stack exchange,提问作者KhiemGOM
相关产品推荐
相关产品推荐

