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?
std :: lower_bound fera cela pour vous. C'est dans la section de comportement équivalent en haut pour binary_search.
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.
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;
}