C
TNA schrieb:
Ich sehe nicht wo das mal komplett richtig gemacht wurde. Korrekterweise müsste man zuerst prüfen, ob der Iterator auf ein gültiges Element zeigt, und falls ja, dieses auf Äquivalenz (abgesehen von Spezialfällen wo Equivalenz und Gleichheit zusammenfallen) prüfen und zwar mit der Vergleichsfunktion des Containers.
Dann hast du sicher seldons Code einfach nicht gesehen. Nochmal mit trivialer Korrektur
template<typename ForwardIt, typename T>
ForwardIt binary_find(ForwardIt first, ForwardIt last, T const &value)
{
first = std::lower_bound(first, last, value);
return first != last && !(value < *first) ? first : last;
}
template<typename ForwardIt, typename T, typename Compare>
ForwardIt binary_find(ForwardIt first, ForwardIt last, T const &value, Compare comp)
{
first = std::lower_bound(first, last, value, comp);
return first != last && !comp(value, *first) ? first : last;
}
Edit: es ist nicht möglich, den < Fall über std::less zu implementieren, sofern value_type des Iterators und T nicht übereinstimmen. Es könnten ja assymetrische Überladungen des < Operators existieren, die zu benutzen wären.