web-dev-qa-db-fra.com

Comment trouver une valeur dans un vecteur C ++ trié?

J'ai regardé find et binary_search , mais find ne profite pas du fait que le vecteur est trié, et binary_search ne renvoie qu'un vrai ou un faux, pas là où il trouvé la valeur. Y a-t-il une fonction qui peut me donner le meilleur des deux mondes?

32
user2813274

std :: lower_bound fera cela pour vous. C'est dans la section de comportement équivalent en haut pour binary_search.

39
Steve Howard

Il existe une méthode, std::equal_range , ce qui vous donnera une paire contenant les bornes inférieure et supérieure du sous-ensemble contenant la valeur souhaitée. Si les deux éléments de la paire sont identiques, la valeur que vous recherchez n'existe pas.

14
paxdiablo
template<class T, class U>
bool contains(const std::vector<T>& container, const U& v)
{
    auto it = std::lower_bound(
        container.begin(),
        container.end(),
        v,
        [](const T& l, const U& r){ return l < r; });
    return it != container.end() && *it == v;
}
2
Gabriel Schreiber