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;