2010-08-13 3 views
4

J'ai des données qui sont stockées dans un vecteur trié. Ce vecteur est trié par une clé. Je sais que la STL a un algorithme pour vérifier si un élément est dans cette liste triée. Cela signifie que je peux écrire quelque chose comme ceci:Comment utiliser std :: binary_search avec une simple clé?

struct MyData { int key; OtherData data; }; 
struct MyComparator 
{ 
    bool operator()(const MyData & d1, const MyData & d2) const 
    { 
    return d1.key < d2.key; 
    } 
}; 

bool isKeyInVector(int key, const std::vector<MyData> &v) 
{ 
    MyData thingToSearchFor; 
    thingToSearchFor.key = key; 
    return std::binary_search(v.begin(), v.end(), thingToSearchFor, MyComparator()); 
} 

Cependant, je trouve la construction de l'objet « thingToSearchFor » inélégante. Y a-t-il un meilleur moyen? Quelque chose de similaire à ça?

struct MyComparator2 
{ 
    bool operator()(const MyData & d1, const MyData & d2) const 
    { 
    return d1.key < d2.key; 
    } 
}; 

bool isKeyInVector2(int key, const std::vector<MyData> &v) 
{ 
    return std::binary_search(v.begin(), v.end(), key, MyComparator2()); 
} 

Répondre

9

Do:

struct MyComparator 
{ 
    bool operator()(int d1, const MyData & d2) const 
    { 
     return d1 < d2.key; 
    } 

    bool operator()(const MyData & d1, int d2) const 
    { 
     return d1.key < d2; 
    } 
}; 

Le prédicat est appelé comme pred(value, ...) ou pred(..., value), alors prenez juste la valeur directement.

+0

Cela semble fonctionner, mais semble enfreindre l'exigence que le prédicat soit un ordre strict faible. En particulier depuis le site SGI STL "Second argument type: Le type du second argument de Strict Weak Ordering Le premier type d'argument et le second type d'argument doivent être identiques." –

+1

@Michael: Je ne vois pas de telles exigences dans la norme C++, en regardant §25.3. SGI! = Bibliothèque standard. – GManNickG

+0

Je peux également trouver aucune mention de cela dans la norme. On dirait que c'est la façon de le faire. –

Questions connexes