W trakcie testowania tego w moim IDE VS2015 i odczytywaniu błędów kompilatora zauważyłem, że Ami Tavory pobił mnie, odpowiadając na pytanie. Być może może to zapewnić pewien wgląd lub jasność co do tego, co się dzieje.
Podczas pierwszego wyszukiwania przy użyciu lower_bound()
kompiluje się zgodnie z informacją Ami, a wynik wyszukiwania jest zwracany do kontenera.
W twoim drugim wyszukiwaniu przy użyciu binary_search()
nie kompiluje się, a ponieważ Ami stwierdziła, że zwraca tylko bool, jak gdyby został znaleziony lub nie. Jak na to nie kompilacji tu jest błąd kompilator z Visual Studio 2015 CE
1>------ Build started: Project: LambdaTemplates, Configuration: Debug Win32 ------
1> LambdaTemplates.cpp
1>c:\program files (x86)\microsoft visual studio 14.0\vc\include\algorithm(2709): error C2664: 'bool main::<lambda_79759dd0460f5d162e02d2bb1cee5db7>::operator()(vector_test *,std::string) const': cannot convert argument 1 from 'const std::string' to 'vector_test *'
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\algorithm(2709): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1> c:\users\skilz80\documents\visual studio 2015\projects\stackoverflowsolutions\lambdatemplates\lambdatemplates.cpp(46): note: see reference to function template instantiation 'bool std::binary_search<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<vector_test *>>>,std::string,main::<lambda_79759dd0460f5d162e02d2bb1cee5db7>>(_FwdIt,_FwdIt,const _Ty &,_Pr)' being compiled
1> with
1> [
1> _FwdIt=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<vector_test *>>>,
1> _Ty=std::string,
1> _Pr=main::<lambda_79759dd0460f5d162e02d2bb1cee5db7>
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
on mówi, że nie można konwertować parametru 1 z const std::string
do vector_test*
więc to, co się tu dzieje? Oddalmy się na chwilę i tymczasowo zapiszmy lambdę poza listą parametrów predykatu funkcji wyszukiwania.Tak więc ta część kodu wyglądałby następująco:
auto myLambda = [](vector_test* ptr, std::string name) {
return name < ptr->get_name();
};
auto it = std::binary_search(test.begin(), test.end(), name, myLambda);
if (it)
std::cout << "It is here\n";
else
std::cout << "It is NOT here\n";
Teraz pozwala sprawdzić błąd kompilatora:
1>------ Build started: Project: LambdaTemplates, Configuration: Debug Win32 ------
1> stdafx.cpp
1> LambdaTemplates.cpp
1>c:\program files (x86)\microsoft visual studio 14.0\vc\include\algorithm(2709): error C2664: 'bool main::<lambda_79759dd0460f5d162e02d2bb1cee5db7>::operator()(vector_test *,std::string) const': cannot convert argument 1 from 'const std::string' to 'vector_test *'
1> c:\program files (x86)\microsoft visual studio 14.0\vc\include\algorithm(2709): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
1> c:\users\skilz80\documents\visual studio 2015\projects\stackoverflowsolutions\lambdatemplates\lambdatemplates.cpp(45): note: see reference to function template instantiation 'bool std::binary_search<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<vector_test *>>>,std::string,main::<lambda_79759dd0460f5d162e02d2bb1cee5db7>>(_FwdIt,_FwdIt,const _Ty &,_Pr)' being compiled
1> with
1> [
1> _FwdIt=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<vector_test *>>>,
1> _Ty=std::string,
1> _Pr=main::<lambda_79759dd0460f5d162e02d2bb1cee5db7>
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Dostajemy bardzo podobny komunikat o błędzie. Więc pozwala wypowiedzieć się wiersz kodu do wywoływania przeszukiwanie binarne i sprawdź komunikaty o błędach kompilatora ...
auto myLambda = [](vector_test* ptr, std::string name) {
return name < ptr->get_name();
};
/*auto it = std::binary_search(test.begin(), test.end(), name, myLambda);
if (it)
std::cout << "It is here\n";
else
std::cout << "It is NOT here\n";
*/
A teraz nie mamy żadnych błędów kompilatora. Więc sama lambda jest w porządku, jednak to, co dzieje się wewnątrz funkcji binary_search()
to:
Jesteś przepuszczenie 2 naprzód iteratory begin
i end
szukaną frazę lub wartość name
który jest std::string
. Twoje forwardujące iteratory są wektorami vector_test pointers
. To nie jest tak, że twoja lambda jest niewłaściwa w rozmowie, po prostu ta funkcja nie może przekształcić się z std::string
będącego typem twoich zapytań w wektor zawierający wskaźniki do obiektów vector_test
, czyniąc to nieprawidłowym typem lambda. do użycia lub nieprawidłowy parametr wyszukiwania. Twoja klasa obiektów vector_test
nie dostarcza żadnych konstruktorów ani współczynników konwersji, ani przeciążonych operatorów do konwersji na std :: string. Również jako notatka przy korzystaniu z binary_search
Twój pojemnik powinien zostać wstępnie posortowany.
Nie używasz tej samej wartości lambda: 'return ptr-> get_name() get_name();', drugie nie znajdzie niczego w leksykograficznie uporządkowanym zasięg. –
BeyelerStudios
@ BeyelerStudios, dobry połów! Dwie lambdy są dokładnie takie same. Ponieważ to nie zadziałało, zmieniłem kolejność. Podczas kopiowania i wklejania tutaj nic się nie zmieniło. Dzięki! – William
@Yakk, spędziłem dużo czasu na edytowaniu formatowania mojego postu. Ale czynisz to doskonałym. Dzięki! – William