C++ 排序向量的二元搜索 模板 大小\u t idx(常数标准::向量&元素,常数C&val) { if(价值要素[s-1]) 返回s; int min=0; int max=s-1; int mid; 而(最大值>=最小值){ 中间=(最大+最小)/2; if(值元素[max]) 返回最大值+1; 如果((val==elements[mid])| |((val>elements[mid-1])&&(valelements[mid])&(valelements[mid+1])) 最小值=中间值+1; 其他的 max=mid-1; } 返回最大值; }

C++ 排序向量的二元搜索 模板 大小\u t idx(常数标准::向量&元素,常数C&val) { if(价值要素[s-1]) 返回s; int min=0; int max=s-1; int mid; 而(最大值>=最小值){ 中间=(最大+最小)/2; if(值元素[max]) 返回最大值+1; 如果((val==elements[mid])| |((val>elements[mid-1])&&(valelements[mid])&(valelements[mid+1])) 最小值=中间值+1; 其他的 max=mid-1; } 返回最大值; },c++,search,binary-search,C++,Search,Binary Search,这与btree有关。元素向量已排序。我想找到向量上的插入点,如果值恰好在向量中,则返回它的索引。此外,例如,向量上有8个插入点,大小为:7。我一直得到一个segfault,我认为这可能是一个:off by one错误或类似错误,可以吗给我一个帮助?谢谢。如果向量大小是2,那么min==mid==0和max==1。在代码中,你检查mid-1处的元素,也就是-1,因此你的程序表现出未定义的行为。无关:我认为仅仅破坏它并利用类似的东西就是作弊。我正在使用similar算法现在可以运行了,但无法通过运行

这与
btree
有关。元素向量已排序。我想找到向量上的插入点,如果值恰好在向量中,则返回它的索引。此外,例如,向量上有8个插入点,大小为:7。我一直得到一个segfault,我认为这可能是一个:off by one错误或类似错误,可以吗给我一个帮助?谢谢。

如果向量大小是2,那么
min==mid==0
max==1
。在代码中,你检查
mid-1
处的元素,也就是
-1
,因此你的程序表现出未定义的行为。

无关:我认为仅仅破坏它并利用类似的东西就是作弊。我正在使用similar算法现在可以运行了,但无法通过运行时测试
template <class T, class C>
size_t idx(const std::vector< T >& elements, const C& val)
{
  if (val<elements[0]||val==elements[0])
    return 0;
  int s=elements.size();
  if (val>elements[s-1])
    return s;
  int min=0;
  int max=s-1;
  int mid;
  while (max >= min){
      mid=(max+min)/2;
      if (val<elements[min])
          return min;
      else if (val>elements[max])
          return max+1;
      else if((val==elements[mid])||((val>elements[mid-1])&&(val<elements[mid])))
          return mid;
      else if((val>elements[mid])&&(val<elements[mid+1]))
          return mid+1;
      else if (val>elements[mid+1])
          min=mid+1;
      else 
            max=mid-1;
    }
    return max;
}