2016-09-03 2 views
0

私はベクトル::イテレータを使用するバイナリ検索の方法を実装しようとしています。これは再帰呼び出しの主なドライバです。サブイテレータを渡すことによるバイナリ検索

template<typename T, typename iter> 
vector<int>::iterator binary_search(iter low, iter high, T key) { 
    if (high < low) return -1; 

    iter median = distance(low, high)/2; 

    if (*median == key) 
     return median; 

    else if (*median > key) 
     return binary_search(low, median - 1, key); 

    return binary_search(median + 1 , high, key); 
} 

しかし、私は、コンパイラのエラーを受け取ります:

は、これまでのところ私は持っている

  • 'binary_search':オーバーロードされた関数のあいまいな呼び出し
  • オーバーロードされた関数の複数のインスタンス「binary_searchを引数リストと一致します

vector<int> nums = { 0,1,2,3,4,5,6,7,8,9 }; 
binary_search(nums.begin(), nums.end(), 1); 

それ以外にも何か不具合を見つけた場合は、教えてください。前もって感謝します。

+0

[std :: binary_search](http://en.cppreference.com/w/cpp/algorithm/binary_search)アルゴリズム関数が 'std ::'名前空間にあることに気が付きますか?だから、既に存在するので、あなた自身のバイナリ検索を書く必要はありません。そうでなければ、[std :: lower_bound](http://en.cppreference.com/w/cpp/algorithm/lower_bound)もあります。 – PaulMcKenzie

+1

また、[mcve]を投稿してください。このようにして、他の人はコンパイラエラーを再現し、エラーがある正確な理由を知ることができます。私の考えは、あなたが 'using namespace std;'を持っていることです。コンパイラは'std :: binary_search'とあなたのバージョンの 'binary_search'の両方を見るので、エラーです。 – PaulMcKenzie

+0

ええ、私はそれを理解しています。私は自分の練習のためにこれを書いています。 @ paul、do will – blueman

答えて

0

@ PaulMcKenzieは、std :: binary_searchを含むアルゴリズムヘッダーと共に、std名前空間で記述していたため、エラーが発生していることを示しました。