C++ C++;-二次二值搜索中的分段错误
我有一个类C++ C++;-二次二值搜索中的分段错误,c++,vector,valgrind,C++,Vector,Valgrind,我有一个类分类账,其实例应该将成员类公司的实例存储在两个向量combyID和combyname中,按两个不同的标准排序-ID和name(都是字符串)。向量一开始是空的,因此不是在每次新添加成员类实例后对它们进行排序,而是使用自定义的二进制搜索方法binsID和binsName搜索向量以查找要添加的元素,如果找不到元素,则将其插入向量中。insert()位置由idx值定义,由二进制搜索方法修改 问题在于方法NewCo,该方法调用两种二进制搜索方法,并最终将元素插入向量。当程序在main函数中使用多
分类账
,其实例应该将成员类公司
的实例存储在两个向量combyID
和combyname
中,按两个不同的标准排序-ID和name(都是字符串)。向量一开始是空的,因此不是在每次新添加成员类实例后对它们进行排序,而是使用自定义的二进制搜索方法binsID
和binsName
搜索向量以查找要添加的元素,如果找不到元素,则将其插入向量中。insert()
位置由idx
值定义,由二进制搜索方法修改
问题在于方法NewCo
,该方法调用两种二进制搜索方法,并最终将元素插入向量。当程序在main
函数中使用多个NewCo
调用运行时,会出现分段错误(堆芯转储)
错误。如果未调用binsID
方法,或者未在combyID
上调用insert()
(忽略对该向量的插入),则不会出现错误。我发布了代码和valgrind分析
守则:
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class ledger
{
public:
bool NewCo (string name, string ID)
{
unsigned int idx_id = 0, idx_name = 0;
bool found1 = binsID(combyID, idx_id, ID); //line 14
bool found2 = binsName(combyname, idx_name, name);
if (found1 == false && found2 == false)
{
company co;
co.co_name = name;
co.co_id = ID;
combyID.insert(combyID.begin() + idx_id, co);
combyname.insert(combyname.begin() + idx_name, co);
return 1;
}
return 0;
}
private:
class company
{
public:
string co_name;
string co_id;
};
vector <company> combyID;
vector <company> combyname;
bool binsName(vector <company> vek, unsigned int & idx, string val)
{
if (vek.size() == 0) return false;
unsigned int begin = 0, end = vek.size() - 1, mid;
while(begin <= end)
{
mid = (begin + end) / 2;
idx = mid;
if (vek[mid].co_name == val)
{
idx = mid;
return true;
}
else if (val < vek[mid].co_name)
end = mid - 1;
else
begin = mid + 1;
}
if (vek[idx].co_name < val) idx++;
return false;
}
bool binsID(vector <company> vek, unsigned int & idx, string val)
{
if (vek.size() == 0) return false;
unsigned int begin = 0, end = vek.size() - 1, mid;
while(begin <= end)
{
mid = (begin + end) / 2;
idx = mid;
if (vek[mid].co_id == val) //line 66
{
idx = mid;
return true;
}
else if (val < vek[mid].co_id)
end = mid - 1;
else
begin = mid + 1;
}
if (vek[idx].co_id < val) idx++;
return false;
}
};
int main ( void )
{
ledger b1;
b1.NewCo( "ABC", "123.456.789" );
b1.NewCo( "DEF", "123.456" ); //line 85
return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
分类账
{
公众:
bool NewCo(字符串名称、字符串ID)
{
无符号整数idx_id=0,idx_name=0;
bool found1=binsID(combyID,idx_id,id);//第14行
bool found2=binsName(combyname,idx_name,name);
if(found1==false&&found2==false)
{
公司;
co.co_name=名称;
co.co_id=id;
插入(combyID.begin()+idx_id,co);
插入(combyname.begin()+idx_name,co);
返回1;
}
返回0;
}
私人:
阶级公司
{
公众:
字符串co_名称;
字符串co_id;
};
向量组合;
向量组合名;
bool binsName(向量vek、无符号int&idx、字符串val)
{
if(vek.size()==0)返回false;
unsigned int begin=0,end=vek.size()-1,mid;
而(begin您将希望在binsName()
和binsID()
方法中检查您的算法
对于您的第二次通过,声明如下:
end = mid - 1;
正在生成end
值-1
(或者在本例中,由于使用的是无符号整数,UINT\u MAX
)由于mid
的值是0
请从布尔函数返回true/false,而不是1/0。此外,您似乎重写了两次。@Borgeader t/f是我的错。我尝试过使用下限,但编写自己的下限似乎更直观。end是0,您在第72行从中减去一个,但因为它是未签名的omes 2^32-1,则无法从循环中断。将being/end int改为unsigned int。
end = mid - 1;