इससे क्या समस्या हल होती है,
देखें डिटमार के जवाब और remyabel का जवाब ।
और क्या यह बदलता है कि मानक कंटेनर कैसे काम करते हैं?
नहीं, डिफ़ॉल्ट रूप से नहीं।
नए सदस्य फंक्शन टेम्प्लेट ओवरलोड्स findआदि आपको एक प्रकार का उपयोग करने की अनुमति देते हैं जो कुंजी के प्रकार का उपयोग करने के बजाय कंटेनर की कुंजी के साथ तुलनीय है। राशनेल और एक विस्तृत, ध्यान से लिखित प्रस्ताव इस सुविधा को जोड़ने के लिए Joaquín M34 López Muñoz द्वारा N3465 देखें ।
ब्रिस्टल बैठक में एलडब्ल्यूजी ने सहमति व्यक्त की कि विषम दिखने वाला फीचर उपयोगी और वांछनीय था, लेकिन हम यह सुनिश्चित नहीं कर सकते थे कि जोएक्विंस का प्रस्ताव सभी मामलों में सुरक्षित होगा। N3465 प्रस्ताव ने कुछ कार्यक्रमों के लिए गंभीर समस्याएँ पैदा की हैं ( मौजूदा कोड अनुभाग पर प्रभाव देखें )। जोकिन ने अलग-अलग ट्रेड-ऑफ के साथ कुछ वैकल्पिक कार्यान्वयन के साथ एक अद्यतन मसौदा प्रस्ताव तैयार किया, जो एलडब्ल्यूजी को पेशेवरों और विपक्षों को समझने में मदद करने के लिए बहुत उपयोगी था, लेकिन उन्होंने सभी कार्यक्रमों को किसी तरह से तोड़ने का जोखिम उठाया, ताकि सुविधा को जोड़ने के लिए कोई आम सहमति न हो। हमने तय किया कि यद्यपि यह सुविधा को बिना शर्त जोड़ना सुरक्षित नहीं होगा, यह सुरक्षित होगा यदि इसे डिफ़ॉल्ट रूप से अक्षम किया गया था और केवल "ऑप्ट इन" किया गया था।
के मुख्य अंतर यह है N3657 प्रस्ताव (जो के आधार पर अपने आप को और एसटीएल द्वारा एक आखिरी मिनट संशोधन था N3465 और जोकिन से एक बाद की अप्रकाशित मसौदा) जोड़ने के लिए था is_transparentप्रोटोकॉल है कि नई कार्यक्षमता में चुनने के लिए इस्तेमाल किया जा सकता के रूप में लिखें।
यदि आप एक "पारदर्शी फ़ंक्टर" (यानी एक is_transparentप्रकार को परिभाषित करता है ) का उपयोग नहीं करते हैं, तो कंटेनर उसी तरह का व्यवहार करते हैं जैसा उन्होंने हमेशा किया है, और यह अभी भी डिफ़ॉल्ट है।
Iff आप का उपयोग करने के लिए चुनते हैं std::less<>(जो C ++ 14 के लिए नया है) या किसी अन्य "पारदर्शी फ़ंक्टर" प्रकार के बाद आपको नई कार्यक्षमता मिलती है।
std::less<>अन्य उपनामों के साथ प्रयोग करना आसान है:
template<typename T, typename Cmp = std::less<>, typename Alloc = std::allocator<T>>
using set = std::set<T, Cmp, Alloc>;
यह नाम is_transparentSTL के N3421 से आया है जिसने "डायमंड ऑपरेटर्स" को C ++ 14 में जोड़ा है। एक "पारदर्शी फ़ंक्टर" वह है जो किसी भी प्रकार के तर्क को स्वीकार करता है (जो कि समान होना जरूरी नहीं है) और बस उन तर्कों को किसी अन्य ऑपरेटर को अग्रेषित करता है। इस तरह के एक फ़नकार को वही होता है जो आप साहचर्य कंटेनरों में विषम खोज के लिए चाहते हैं, इसलिए प्रकार is_transparentको सभी हीरा ऑपरेटरों के साथ जोड़ा गया था और नई कार्यक्षमता को इंगित करने के लिए टैग प्रकार के रूप में इस्तेमाल किया गया था जो कि सहयोगी कंटेनरों में सक्षम होना चाहिए। तकनीकी रूप से, कंटेनरों को "पारदर्शी फ़ंक्टर" की आवश्यकता नहीं है, बस एक है जो इसे विषम प्रकारों के साथ कॉल करने का समर्थन करता है (जैसे कि https://stackoverflow.com/a/18940595/981959pointer_comp में टाइप STL की परिभाषा के अनुसार पारदर्शी नहीं है)pointer_comp::is_transparentइसे समस्या को हल करने के लिए उपयोग करने की अनुमति देता है)। यदि आप कभी भी अपने std::set<T, C>प्रकार की कुंजियों के साथ देखते हैं Tया intफिर Cकेवल प्रकार के तर्कों के साथ कॉल करने की आवश्यकता होती है Tऔर int(किसी भी क्रम में), तो इसे वास्तव में पारदर्शी होने की आवश्यकता नहीं है। हमने उस नाम का आंशिक रूप से उपयोग किया क्योंकि हम एक बेहतर नाम के साथ नहीं आ सकते थे (मैं पसंद करूंगा is_polymorphicक्योंकि ऐसे फ़ंक्शंस में स्थैतिक बहुरूपता का उपयोग होता है, लेकिन पहले से ही एक std::is_polymorphicप्रकार का लक्षण है जो गतिशील बहुरूपता को संदर्भित करता है)।