#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
ないことを見ることができますか?
実際には実装に依存しないと思います。 'lower_bound'は、' lower_bound'がイテレータ 'i'を返し、' i'の前に 'j 'のすべての' j'を、 'upper_bound'はイテレータ' i'を返します。 '!(value < * j)' 'i 'の前のすべての' j'に対して、 'value'は' const T& 'です。したがって、 'operator <'への引数の順序と定数は正確に指定されています。 – aschepler
'lower_bound'は、ほとんどの標準アルゴリズムと同様に、決して' operator> '、' operator <'のみを使用しません。 – aschepler
@aschepler非常にありがとう、答えが更新されました! – gsamaras