加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:26:16 所属栏目:百科 来源:网络整理
导读:我是C的新手.我在线看到这个代码,它试图在一个向量中找到一个字符串.但是,我注意到了最终的结局: mid = beg + (end - beg) / 2; 为什么要这样写,为什么不能写成: mid = (beg + end) /2 是中间=(乞求(结束-1))/ 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是无效的.您可以减去两个迭代器来获取它们之间的距离,但不能添加两个迭代器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读