2017-09-20 7 views
1

プログラムはベクトルでバイナリ検索する必要があります。最後に、見つかった要素を出力します。私のコードは次のようになります!演算子 "!="(C++イテレータ)には一致しません

#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 

int main() 
{ 
    vector<string> s{"a","b","c"}; 

    auto beg=s.begin(), end=s.end(), mid=s.begin()+(end-beg)/2; 
    auto sought='c'; 

    while(*mid!=sought && mid!=end) 
    { 
     if(*mid>sought) 
      end=mid; 

     else 
       beg=mid+1; 

     mid=beg+(end-beg)/2; 
    } 

    cout<<(*mid)<<endl; 
    return 0; 
} 

それはエラーがその演算子であることを述べている=(!!*半ば= & &半ば=エンドを求めた)で一致していません。私がベクトルの代わりに単純な文字列でそれをしようとすると動作します。

+3

ところで、あなたの条件は '&&'の左の '半ば= end'を持っている必要があります。

auto sought = "c"; // C-style string 

かへ! – Slava

+1

いつものように:「using namespace std」は使わないでください。 [ここを参照してください](https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice) – klutt

+0

あなたはstd :: lower_boundを知っていますか? –

答えて

4

'c'のタイプはcharです。 *midのタイプはstd::stringです。 operator!=は、charstd::stringの間に定義されていません。

あなたがにsoughtを変更することができます。そうしないと、UBを得ることができ、

using namespace std::literals; 
auto sought = "c"s; // `std::string` 
+4

または ' {'a'、 'b'、 'c'};';) – NathanOliver

+0

これは問題でした。ありがとうございます。 –

+2

はい、しかし、参照を解除する前に 'end'のためにテストしてください! 'while(mid!= end && * mid!= sough)' – Christophe

関連する問題