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

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

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

mid = (beg + end) /2

是中间=(乞求(结束-1))/ 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是无效的.您可以减去两个迭代器来获取它们之间的距离,但不能添加两个迭代器.

原文链接:https://www.f2er.com/c/111421.html

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