जैसा कि मैं अपने आईडीई वीएस2015 में इसके साथ परीक्षण कर रहा था और संकलक त्रुटियों को पढ़ रहा था, मैंने देखा कि अमी टैवरी ने मुझे इस सवाल का जवाब देने के लिए हराया। तो हो सकता है कि यह कुछ अंतर्दृष्टि या स्पष्टता प्रदान कर सके कि क्या हो रहा है।
lower_bound()
का उपयोग करके अपनी पहली खोज में यह एमी के रूप में संकलित करता है और आपके कंटेनर को एक इटरेटर खोज से वापस किया जा रहा है।
binary_search()
का उपयोग करके आपकी दूसरी खोज में यह संकलित नहीं होता है, और जैसा कि अमी ने कहा है कि यह केवल एक बूल देता है जैसे कि यह पाया गया था या नहीं। इसे यहाँ संकलन नहीं के रूप में दृश्य स्टूडियो 2015 सीई से संकलक त्रुटि है
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 ==========
इसमें कहा गया है कि यह vector_test*
तो करने के लिए const std::string
से पैरामीटर 1 परिवर्तित नहीं कर सकते कि यहाँ क्या हो रहा है? आइए एक पल के लिए अमूर्त हो जाएं और खोज फ़ंक्शन कॉल पूर्वानुमान पैरामीटर सूची के बाहर अस्थायी रूप से लैम्ब्डा लिखने दें।तो कोड के इस खंड इस प्रकार दिखाई देगा:
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";
*/
और अब हम किसी भी संकलक त्रुटियों नहीं मिलता है। तो लैम्ब्डा ही है, ठीक है, लेकिन क्या binary_search()
समारोह के भीतर क्या हो रहा है यह है:
आप इसे से गुजर रहे हैं 2 आगे Iterators begin
और end
कोई खोज शब्द या मूल्य name
जो एक std::string
है। आपके आगे इटरेटर vector_test pointers
के वेक्टर हैं। ऐसा नहीं है कि आपका लैम्ब्डा इतना बोलने में गलत है, यह सिर्फ यह है कि फ़ंक्शन std::string
से आपके वेक्टर क्वेरी डेटा प्रकार को वेक्टर में परिवर्तित नहीं कर सकता है जिसमें पॉइंटर्स vector_test
ऑब्जेक्ट्स हैं, इस प्रकार यह गलत प्रकार का लैम्ब्डा बनाते हैं उपयोग करने के लिए, या गलत खोज पैरामीटर। vector_test
ऑब्जेक्ट्स की आपकी कक्षा किसी भी कन्स्ट्रक्टर या रूपांतरण कारकों, या अधिभारित ऑपरेटरों को एक std :: स्ट्रिंग में कनवर्ट करने की आपूर्ति नहीं करती है। binary_search
का उपयोग करते समय एक साइड नोट के रूप में भी आपका कंटेनर पूर्व-क्रमबद्ध होना चाहिए।
आप उसी लैम्ब्डा का उपयोग नहीं करते हैं: 'वापसी पीआरटी-> get_name() get_name() के समान नहीं है; 'दूसरा, लेक्सिकोोग्राफ़िक रूप से आदेश में कुछ भी नहीं मिलेगा रेंज। –
BeyelerStudios
@ बेइलर स्टुडियो, अच्छी पकड़! दो भेड़िये बिल्कुल वही हैं। चूंकि यह काम नहीं करता है, मैंने आदेश बदल दिया। यहां कॉपी और पेस्ट करते समय, मैंने वापस नहीं बदला। धन्यवाद! – William
@ यक, स्वीकार्य रूप से, मैंने अपनी पोस्ट के प्रारूपण को संपादित करने में काफी समय बिताया। लेकिन आप इसे सही बनाते हैं। धन्यवाद! – William