GOOGLE ADS

Sonntag, 1. Mai 2022

Warum hat die Standardbibliothek find und find_if?

Könnte nicht find_ifnur eine Überladung von sein find? So std::binary_searchmachen es Freunde...


Lösung des Problems

Ein Prädikat ist eine gültige Sache, die gefunden werden muss, sodass Sie zu Mehrdeutigkeiten gelangen könnten.

Betrachten find_ifwird umbenannt find, dann haben Sie:

template <typename InputIterator, typename T>
InputIterator find(InputIterator first, InputIterator last, const T& value);
template <typename InputIterator, typename Predicate>
InputIterator find(InputIterator first, InputIterator last, Predicate pred);

Was also tun mit:

find(c.begin(), c.end(), x); // am I finding x, or using x to find?

Anstatt zu versuchen, eine komplizierte Lösung zur Unterscheidung zu xfinden (was nicht immer möglich ist *), ist es einfacher, sie einfach zu trennen.

*Dies wäre zweideutig, unabhängig davon, was Ihr Schema ist oder wie mächtig es sein könnte†:

struct foo
{
template <typename T>
bool operator()(const T&);
};
bool operator==(const foo&, const foo&);
std::vector<foo> v = /*... */;
foo f = /*... */;
// f can be used both as a value and as a predicate
find(v.begin(), v.end(), f);

†Gedankenlesen aufsparen.

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...