std::find brak wersji z funkcją porównującą predykatem lub funktorem

0

Witam

Zastanawia mnie uzasadnienie dla braku wersji std::find z funktorem (pisząc w uproszczeniu).
Wiem, że można użyć find_if i przekazać jakiś funktor zainicjowany wartością, którą chcemy znaleźć. Ma to jakiś sens. Ale brak std::find z funktorem sprawia, że nie można użyć tej funkcji w implementacji std:

 
template <class ForwardIterator1, class ForwardIterator2> ForwardIterator1 find_first_of(ForwardIterator1 first1, ForwardIterator1 last1,
		ForwardIterator2 first2, ForwardIterator2 last2) {
		
		if (first1 == last1)
			return last1;
		if (first2 == last2) {
			return last1;
		}
		while (first1 != last1) {
			if (pmstl::find(first2, last2, *first1) != last2)
				return first1;
			++first1;
		}
		return last1;
	}

Wszak

if (pmstl::find(first2, last2, *first1) != last2) 

nie przyjmuje funktora i trzeba pisać for/while co jest błędotwórcze i nie zgodne z duchem wielokrotnego wykorzystania kodu.
Jakie jest Wasze zdanie na ten temat:D

2

No przecież jest wersja std::find_first_of z predykatem.
http://en.cppreference.com/w/cpp/algorithm/find_first_of (3)(4)

2

Dlatego od C++17 już masz find_first_of z predykatem: http://en.cppreference.com/w/cpp/algorithm/find_first_of

0

No wiem, że jest wersja find_first_of z predykatem. Nie ubolewam nad brakiem find_first_of. Ubolewam nad brakiem find z predykatem. Bez tego w implementacji find_first_of dla wersji z predykatem nie możemu użyć std::find tylko trzeba jechać for'em.

0

mozesz przeciez napisac wlasna funkcje find ktora przyjmuje funkcje i masz jedna funkcje i korzystasz ze swojej. To ze bedziesz mial tam petle to w biblotece tez bys mial...

a ze std::find nie ma przeciazonej funkcji na funkcje to masz od tego find_if bo przeciez chcesz cos jeszcze sprawdzac dlatego masz osobna funkcje od tego

albo robisz problem ktory nie istnieje albo slabo tlumaczysz przyklad bo
"Ale brak std::find z funktorem sprawia, że nie można użyć tej funkcji w implementacji std:"
moim zdaniem jest pytanie proste. Dlaczego tak?

1

Zacznijmy od tego, że implementacja find_first_of nie musi korzystać z find: http://en.cppreference.com/w/cpp/algorithm/find_first_of

No ale załóżmy, że bardzo chcesz używać find, no to przecież dla find_first_of bez predykatu możesz użyć find, a dla wersji z predykatem możesz użyć find_if.
Gdyby istniał find z predykatem to i tak masz 2 osobne implementacje find_first_of, które wołają 2 osobne implementacje find, więc nie bardzo widzę tutaj zysku.

0

Problem jest trochę filozoficzny. Przyznaję. Po prostu bawię się w implementacje stl. I uważam, że w stl w implementacji find_first_of powinno być:

 
while (first1 != last1) {
    if (pmstl::find(first2, last2, *first1/*,pred*/) != last2) //gdzie pred dla find_first_of z predykatem
        return first1;
    ++first1;
}

A jest zwykła pętla for.

Oczywiście ja moge sobie zaimplementowć jak chcę, mogę sobie też napisać własną wersje find z predykatem, ale implementacja biblioteki standardowej powinna być wzorem do naśladowania. Brak find z predykarem utrudnia reużywalność kodu.

2

No jak się nie da jak się da.
http://melpon.org/wandbox/permlink/VSMCMTCd4vTkeXip

0
twonek napisał(a):

Gdyby istniał find z predykatem to i tak masz 2 osobne implementacje find_first_of, które wołają 2 osobne implementacje find, więc nie bardzo widzę tutaj zysku.

Nie. Funkcje find_first_of może użyć generycznego funktora porównującego i od razu wołać find_first_of dla wersji z predykatem. Tak ma to miejsce w implementacji dostarczonej z VS 2015:

 
find_first_of(...)
{
    return ((_First1, _Last1, _First2, _Last2, equal_to<>()));
}
0
pingwindyktator napisał(a):

No jak się nie da jak się da.
http://melpon.org/wandbox/permlink/VSMCMTCd4vTkeXip

Faktycznie się da :) Uważam, że to takie małe oszustwo, ale dysusja o tym pewnie nadawałaby się na osobny wątek więc uważam temat za wyczerpany. Thx.

1 użytkowników online, w tym zalogowanych: 0, gości: 1