fonction de comparaison dans la borne inférieure

J’ai la structure suivante

enum quality { good = 0, bad, uncertain }; struct Value { int time; int value; quality qual; }; class MyClass { public: MyClass() { InsertValues(); } void InsertValues(); int GetLocationForTime(int time); private: vector valueContainer; }; void MyClass::InsertValues() { for(int num = 0; num < 5; num++) { Value temp; temp.time = num; temp.value = num+1; temp.qual = num % 2; valueContainer.push_back(temp); } } int MyClass::GetLocationForTime(int time) { // How to use lower bound here. return 0; } 

Dans le code ci-dessus, j’ai été jeté avec beaucoup d’erreurs de compilation. Je pense que je me trompe ici, je suis nouveau dans la programmation STL et pouvez-vous me corriger s’il vous plaît où est l’erreur? Y a-t-il mieux à faire cela?

Merci!

Le prédicat doit prendre deux parameters et renvoyer bool.

Comme votre fonction est une fonction membre, elle porte une mauvaise signature.

De plus, vous aurez peut-être besoin de pouvoir comparer Valeur à Int, Valeur à Valeur, Int à Valeur et Int à Int en utilisant votre foncteur.

 struct CompareValueAndTime { bool operator()( const Value& v, int time ) const { return v.time < time; } bool operator()( const Value& v1, const Value& v2 ) const { return v1.time < v2.time; } bool operator()( int time1, int time2 ) const { return time1 < time2; } bool operator()( int time, const Value& v ) const { return time < v.time; } }; 

C'est assez lourd, alors réduisons-le:

 struct CompareValueAndTime { int asTime( const Value& v ) const // or static { return v.time; } int asTime( int t ) const // or static { return t; } template< typename T1, typename T2 > bool operator()( T1 const& t1, T2 const& t2 ) const { return asTime(t1) < asTime(t2); } }; 

puis:

 std::lower_bound(valueContainer.begin(), valueContainer.end(), time, CompareValueAndTime() ); 

Il y a aussi quelques autres erreurs, par exemple pas de point-virgule à la fin de la déclaration de classe, plus le fait que les membres d'une classe sont privés par défaut, ce qui rend votre classe entière privée dans ce cas. Vous avez manqué un public: devant le constructeur?

Votre fonction GetLocationForTime ne renvoie pas de valeur. Vous devez prendre le résultat de lower_bound et soustraire begin (). La fonction devrait aussi être const.

Si le but de cet appel est d'insérer ici, alors considérez le fait que l'insertion au milieu d'un vecteur est une opération O (N) et que, par conséquent, le vecteur peut être le type de collection incorrect ici.

Notez que l'algorithme lower_bound ne fonctionne que sur des collections pré-sortingées. Si vous voulez pouvoir consulter différents membres sans recourir continuellement, vous voudrez créer des index sur ces champs, en utilisant éventuellement le multi_index de multi_index

Une erreur est que le quasortingème argument de lower_bound ( compareValue dans votre code) ne peut pas être une fonction membre. Ce peut être un foncteur ou une fonction gratuite. En faire une fonction gratuite qui est un ami de MyClass semble être la plus simple dans votre cas. Aussi, il vous manque le mot-clé de retour.

 class MyClass { MyClass() { InsertValues(); } void InsertValues(); int GetLocationForTime(int time); friend bool compareValue(const Value& lhs, const Value& rhs) { return lhs.time < rhs.time; } 
  1. Class mot clé de Class doit partir de la class inférieure c .
  2. struct Value a une struct Value type qualtiy au lieu de quality
  3. Je ne vois pas using namespace std pour utiliser des types STL sans cela.
  4. vectorvalue type incorrecte au lieu de Value
  5. Etc.

Vous devez le vérifier avant de poster ici avec de telles erreurs simples, je pense. Et le problème principal ici est que la fonction de comparaison ne peut pas être membre de la classe. Utilisez-le comme fonction libre:

 bool compareValue(const Value lhs, const int time) { return lhs.time < time ; } 

class est le mot clé et non “classe”:

 class MyClass { 

Et son corps devrait être suivi d’un point-virgule ; .
Il peut y avoir d’autres erreurs, mais vous devrez peut-être les coller dans la question pour obtenir de l’aide.

Vous voulez juste faire de compareValue() une fonction normale. De la manière dont vous l’avez implémenté maintenant, vous avez besoin d’un object de type MyClass . La façon dont std::lower_bound() tentera de l’appeler, il ne fera que passer en deux arguments, sans object supplémentaire Si vous voulez vraiment que la fonction soit membre, vous pouvez en faire un membre static .

Cela dit, l’utilisation directe des fonctions est pénalisée. Vous voudrez peut-être avoir le type de comparateur avec un opérateur d’appel de fonction en inline :

 struct MyClassComparator { bool operator()(MyClass const& m0, MyClass const& m1) const { return m0.time < m1.time; } }; 

... et utilisez MyClassComparator() comme comparateur.