当我在我的 IDE VS2015 中对此进行测试并阅读编译器错误时,我注意到 Ami Tavory 在回答问题时击败了我。因此,也许这可以为正在发生的事情提供一些洞察力或清晰度。
在您使用它的第一次搜索中lower_bound()
,它确实按照 Ami 所述进行编译,并且从搜索中返回了一个指向您容器的迭代器。
在您使用它的第二次搜索中binary_search()
,它不会编译,并且正如 Ami 所说,它只返回一个布尔值,就好像它是否被发现一样。至于它没有在这里编译是来自 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 ==========
它说它不能将参数 1 从转换const std::string
为vector_test*
那么这里发生了什么?让我们暂时抽象一下,让我们暂时将 lambda 写在搜索函数调用谓词参数列表之外。所以这部分代码看起来像这样:
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";
现在让我们检查一下编译器错误:
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 ==========
我们得到一个非常相似的错误信息。因此,让我们注释掉调用二进制搜索的代码行并检查编译器错误消息...
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";
*/
现在我们没有得到任何编译器错误。所以 lambda 本身很好,但是binary_search()
函数中发生的事情是这样的:
您正在向它传递 2 个前向迭代器begin
和end
一个搜索词或值name
,即std::string
. 您的前向迭代器是 的向量vector_test pointers
。这并不是说您的 lambda 是错误的,只是该函数无法从std::string
您的搜索查询数据类型转换为包含指向vector_test
对象的指针的向量,从而使该类型成为错误的 lambda 使用,或错误的搜索参数。您的vector_test
对象类不提供任何构造函数或转换因子,或重载运算符以转换为 std::string。另外,在使用binary_search
容器时应预先分类。