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());
}
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." –
@Michael: Je ne vois pas de telles exigences dans la norme C++, en regardant §25.3. SGI! = Bibliothèque standard. – GManNickG
Je peux également trouver aucune mention de cela dans la norme. On dirait que c'est la façon de le faire. –