【问题标题】:Vector error,a very confusing segmentation error?矢量错误,一个非常混乱的分割错误?
【发布时间】:2019-06-17 03:16:21
【问题描述】:

所以基本上,我正在编写一个在向量中搜索向量元素的代码。虽然我想到了这种方法,但实现它却让我遇到了分段错误。我缩小了问题的范围

在代码中,如果我在注释上述内容的同时对 for 循环中的行进行注释,则 B[i] 的所有元素都将被显示。为什么会引发分段错误。我认为 binary_return 或多或少是正确的,如果我用 binary_return(A,0,A.size(),B[1]) 然后它的工作。 代码如下:

#include<iostream>
#include<vector>

using namespace std;

int binary_return(vector<int> a,int start,int end,int seek)
{
    int mid = (start+end)/2;
    //cout<<start<<" "<<seek<<" "<<mid;
    if(end!=start)
    {
        if(a[mid]==seek)
        {
            return mid;
        }
        else if(a[mid]>seek)
        {
            return binary_return(a,start,mid,seek);
        }
        else if(a[mid]<seek)
        {
            return binary_return(a,mid,end,seek);
        }
    }
    else
        return -1;
}

int main()
{
    vector<int> A{1,3,6,9,23};
    vector<int> B{1,4,23};
    cout<<B[0]<<B[1]<<B[2];
    for(int i=0;i<B.size();i++)
    {
        cout<<binary_return(A,0,A.size(),B[i]);
        //cout<<binary_return(A,0,A.size(),B[0]);
    }
    return 1;
}

【问题讨论】:

  • 你的意思是第三次返回是:return binary_return(a,mid+1,end,seek);

标签: c++ vector binary-search-tree binary-search


【解决方案1】:

您的代码没有正确处理最后一种情况,并以无限递归结束。

不幸的是,这在 C++ 中意味着任何事情都可能发生(不能保证您会得到有意义的错误)。

在函数开头添加调试打印,您将看到在哪些情况下进入了无限递归。

【讨论】:

    【解决方案2】:

    你在第三个 if 语句中有无限递归 以下为正确代码:

    #include<iostream>
    #include<vector>
    
    using namespace std;
    
    int binary_return(vector<int> a,int start,int end,int seek)
    {
        int mid = (start+end)/2;
        //cout<<start<<" "<<seek<<" "<<mid;
        if(end!=start)
        {
            if(a[mid]==seek)
            {
                return mid;
            }
            else if(a[mid]>seek)
            {
                return binary_return(a,start,mid,seek);
            }
            else if(a[mid]<seek)
            {
                // In your sample you forgot to add +1 (mid+1) for next start
                return binary_return(a,mid+1,end,seek);
            }
        }
        else
            return -1;
    }
    
    int main()
    {
        vector<int> A{1,3,6,9,23};
        vector<int> B{1,4,23};
        for(int i=0;i<B.size();i++)
        {
            cout<<binary_return(A,0,A.size(),B[i]);
        }
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 2021-12-16
      • 2016-11-07
      • 1970-01-01
      相关资源
      最近更新 更多