c – 在向量中找到中间项,为什么要使用“mid = beg(end-beg)/ 2”而不是“mid =(beg end)/ 2”

前端之家收集整理的这篇文章主要介绍了c – 在向量中找到中间项,为什么要使用“mid = beg(end-beg)/ 2”而不是“mid =(beg end)/ 2”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是C的新手.我在线看到这个代码,它试图在一个向量中找到一个字符串.但是,我注意到了最终的结局: @H_301_2@mid = beg + (end - beg) / 2;

为什么要这样写,为什么不能写成:

@H_301_2@mid = (beg + end) /2

是中间=(乞求(结束-1))/ 2一个可行的替代方案?

我很难理解背后的原因.

@H_301_2@vector<string> text = {"apple","beer","cat","dog"}; string sought = "beer"; auto beg = text.begin(),end = text.end(); auto mid = text.begin() + (end - beg) / 2; while (mid != end && *mid != sought){ if(sought < *mid){ end = mid; } else { beg = mid + 1; } mid = beg + (end - beg) / 2; }

解决方法

一般来说,二进制搜索的原因是为了避免溢出.乞求结束是受到大量溢出的溢出.使用end-beg避免溢出.

想象一下,乞求是MAX_INT-3,结束是MAX_INT-1,那么请求结束将大于MAX_INT,但结束乞求只会是2.

使用迭代器,这也是因为end-begin是一个数字,而begin end是无效的.您可以减去两个迭代器来获取它们之间的距离,但不能添加两个迭代器.

猜你在找的C&C++相关文章