简体   繁体   English

对排序向量进行二进制搜索

[英]Binary search on sorted vector

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;
}

This is related to btree . 这与btree有关。 Element vector is sorted. 元素向量已排序。 I want to find the insertion point on this vector, if the value happens to be in the vector, return the index of it. 我想在此向量上找到插入点,如果该值恰好在向量中,则返回它的索引。 Also, there is, for example, 8 insertion point on the vector of size: 7. I keep getting a segfault and I think this might be an: off by one error or similar, can some one help? 此外,例如,在大小为矢量的向量上有8个插入点:7.我一直在遇到段错误,我认为这可能是一个错误:由于一个错误或类似原因,可以提供一些帮助吗? Thanks. 谢谢。

If vector size is 2, then min == mid == 0 and max == 1 . 如果向量大小为2,则min == mid == 0max == 1 And in the code you check element at mid - 1 , that is -1 , so your program exhibits undefined behaviour. 并且在代码中,您在mid - 1检查元素-1 ,因此您的程序表现出未定义的行为。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM