2017-10-09 5 views
1

code:Le paramètre de func upper_bound?

#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; 
} 

Lors de la compilation, il produit cette erreur:

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 

A partir du résultat, nous pouvons voir que upper_bound a une erreur, mais lower_bound n'a pas, pourquoi?

Répondre

0

Modifier ceci:

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

à ceci:

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

puisque vous devez marquer votre opérateur const, afin de pouvoir fonctionner sur un opérande const.


« Pourquoi l'erreur apparaissent pour upper_bound mais pas pour lower_bound? »

Si vous vérifiez le niveau de upper_bound, il est dit:

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

Maintenant, lower_bound d'autre part mentionne:

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

Ainsi, les deux fonctions utiliseront votre operator < (si vous cochez la standard de plus près, ils n'utiliseraient cet opérateur que dans tous les cas). Alors, quels changements?

L'ordre des arguments!

Le problème est que tt &r est const, et dans le cas de upper_bound, il est appelé comme:

comp(value, *j) 

Ici, *j sera votre argument de type const.

Alors que dans le cas de lower_bound, comme:

comp(*j, value) 

Ici, value sera votre argument de type const. C'est la raison de l'erreur de compilation.

+1

Je ne pense pas que cela dépende de l'implémentation. La norme spécifie 'lower_bound' renvoie un itérateur' i' où '* j aschepler

+0

'lower_bound', comme la plupart des algorithmes standard, n'utilisera * jamais * operator +, mais seulement' operator <'. – aschepler

+0

@aschepler merci beaucoup, réponse mise à jour! – gsamaras