2017-10-09 9 views
1

コード:func upper_boundのparam?

#include "inc.h" 
#include <string> 
#include <vector> 
#include <algorithm> 
#include <iostream> 
using namespace std; 


class tt{ 
    public: 
     tt(int i): i(i) {} 
     int i; 
     bool operator < (const tt &r) 
     { 
      return i < r.i; 
     } 

}; 



int test_lower_bound() 
{ 
    vector<tt> a; 
    a.push_back(tt(1)); 
    a.push_back(tt(2)); 
    a.push_back(tt(3)); 
    a.push_back(tt(4)); 
    a.push_back(tt(5)); 

    vector<tt>::iterator result = lower_bound(a.begin(), a.end(), tt(3)); 
    cout << result->i << endl; 
    return 0; 
} 

int test_upper_bound() 
{ 
    vector<tt> a; 
    a.push_back(tt(1)); 
    a.push_back(tt(2)); 
    a.push_back(tt(3)); 
    a.push_back(tt(4)); 
    a.push_back(tt(5)); 

    vector<tt>::iterator result = upper_bound(a.begin(), a.end(), tt(3)); 
    cout << result->i << endl; 
    return 0; 
} 

int main(int argc, char** argv) 
{ 
    test_lower_bound(); 
    return 0; 
} 

コンパイルすると、それはこのエラーを生成します。

In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/algorithm:62, 
       from main.cc:4: 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h: In function ‘_FIter std::upper_bound(_FIter, _FIter, const _Tp&) [with _FIter = __gnu_cxx::__normal_iterator<tt*, std::vector<tt, std::allocator<tt> > >, _Tp = tt]’: 
main.cc:45: instantiated from here 
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_algo.h:2542: error: passing ‘const tt’ as ‘this’ argument of ‘bool tt::operator<(const tt&)’ discards qualifiers 

結果から、我々はupper_boundにエラーがあるが、なぜ、lower_boundないことを見ることができますか?

答えて

0

変更この:これに

bool operator < (const tt &r) { return i < r.i; } 

bool operator < (const tt &r) const { return i < r.i; } 

あなたはconstオペランドを操作することができるようにするために、constとしてあなたオペレータをマークする必要があるため。


「なぜエラーがupper_boundのためではなく、lower_boundのために現れていますか?」

あなたがupper_boundの標準をチェックすると、それは言う:

upper_bound returns the furthermost iterator i in [first, last) such that, for every iterator j in [first, i), comp(value, *j) is false .

、一方lower_boundが言及:

lower_bound returns the furthermost iterator i in [first, last) such that, for every iterator j in [first, i), comp(*j, value) is true .

あなたがチェックのであれば、両方の機能は、(あなたのoperator <を使用します。標準より密接に、彼らはどんな場合でもその演算子を使用します)。だから何が変わるの?

引数の順序!

問題はtt &rconstであるということである、とのようなupper_boundの場合には、それが呼ばれています:ここで

comp(value, *j) 

*jはあなたのconstの引数になります。

lower_boundの場合には、同様にしながら:

ここ
comp(*j, value) 

valueは、あなたのconstの引数になります。これがコンパイルエラーの理由です。

+1

実際には実装に依存しないと思います。 'lower_bound'は、' lower_bound'がイテレータ 'i'を返し、' i'の前に 'j 'のすべての' j'を、 'upper_bound'はイテレータ' i'を返します。 '!(value < * j)' 'i 'の前のすべての' j'に対して、 'value'は' const T& 'です。したがって、 'operator <'への引数の順序と定数は正確に指定されています。 – aschepler

+0

'lower_bound'は、ほとんどの標準アルゴリズムと同様に、決して' operator> '、' operator <'のみを使用しません。 – aschepler

+0

@aschepler非常にありがとう、答えが更新されました! – gsamaras

関連する問題