2014-11-07 3 views
0
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; 
} 

Это связано с btree. Вектор элемента отсортирован. Я хочу найти точку вставки для этого вектора, если значение находится в векторе, верните его индекс. Кроме того, есть, например, 8 точек вставки в векторе размера: 7. Я продолжаю получать segfault, и я думаю, что это может быть: отключено одной ошибкой или подобным, может ли кто-нибудь помочь? Благодарю.Двоичный поиск по отсортированным вектором

+0

Несвязанный: я предполагаю, что просто обманываю это и использую что-то вроде ['std :: lower_bound'] (http://en.cppreference.com/w/cpp/algorithm/lower_bound), обманывая. – WhozCraig

+0

Я использую подобный алгоритм сейчас, и он работает, но не может пройти тест времени выполнения – user4228739

ответ

1

Если размер вектора 2, то min == mid == 0 и max == 1. И в коде вы проверяете элемент на mid - 1, то есть -1, поэтому ваша программа демонстрирует неопределенное поведение.

Смежные вопросы