矢量错误,一个非常混乱的分割错误?
Vector error,a very confusing segmentation error?
所以基本上,我正在编写一个代码来搜索 vector.While 中的向量元素我缩小了问题范围
在代码中,如果我在评论上面的内容时取消注释 for 循环中的行,那么 B[i] 的所有元素都被 displayed.Why 那么就会抛出一个分段错误。我认为 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;
}
您的代码没有正确处理最后一种情况,最终导致无限递归。
不幸的是,在 C++ 中这意味着任何事情都可能发生(您不能保证会得到有意义的错误)。
在函数开头添加调试打印,您将看到在哪些情况下您进入了无限递归。
你在第三个 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;
}
所以基本上,我正在编写一个代码来搜索 vector.While 中的向量元素我缩小了问题范围
在代码中,如果我在评论上面的内容时取消注释 for 循环中的行,那么 B[i] 的所有元素都被 displayed.Why 那么就会抛出一个分段错误。我认为 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;
}
您的代码没有正确处理最后一种情况,最终导致无限递归。
不幸的是,在 C++ 中这意味着任何事情都可能发生(您不能保证会得到有意义的错误)。
在函数开头添加调试打印,您将看到在哪些情况下您进入了无限递归。
你在第三个 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;
}