तुलना एसटीडी :: स्ट्रिंग और सी-स्टाइल स्ट्रिंग शाब्दिक


9

मान लीजिए कि मेरे पास निम्नलिखित कोड हैं:

#include <iostream>
#include <string>
#include <iomanip>
using namespace std; // or std::

int main()
{
    string s1{ "Apple" };
    cout << boolalpha;
    cout << (s1 == "Apple") << endl; //true
}

मेरा सवाल है: सिस्टम इन दोनों के बीच कैसे जांच करता है? s1एक वस्तु है जबकि "Apple"एक सी-स्टाइल स्ट्रिंग शाब्दिक है।

जहाँ तक मुझे पता है, विभिन्न डेटा प्रकारों की तुलना नहीं की जा सकती है। मुझे यहां क्या समझ नहीं आ रहा है?


6
basic_string / operator_cmp (आपके मामले में (7))।
Jarod42

2
Fwiw, जब तक कि एक प्रकार को दूसरे में बदला जा सकता है, आप आम तौर पर उनकी तुलना कर सकते हैं। आप std::stringएक सी-स्ट्रिंग से इनिशियलाइज़ कर सकते हैं ।
नाथनऑलिवर

जवाबों:


16

यह निम्न तुलना ऑपरेटर के लिए परिभाषित होने के कारण हैstd::string

template< class CharT, class Traits, class Alloc >
bool operator==( const basic_string<CharT,Traits,Alloc>& lhs, const CharT* rhs );  // Overload (7)

यह std::stringऔर के बीच तुलना की अनुमति देता है const char*। इस प्रकार जादू!


@ पे बेकर की टिप्पणी को चोरी करना :

"पूर्णता के लिए, यदि यह अधिभार मौजूद नहीं था, तो तुलना अभी भी काम करेगी; कंपाइलर सी-स्टाइल स्ट्रिंगstd::string से एक अस्थायी ऑब्जेक्ट का निर्माण करेगा और दो वस्तुओं की तुलना करेगा , का पहला अधिभार std::stringoperator==

template< class CharT, class Traits, class Alloc >
bool operator==( const basic_string<CharT,Traits,Alloc>& lhs,
                 const basic_string<CharT,Traits,Alloc>& rhs );   // Overload (1)

यही कारण है कि यह ऑपरेटर (यानी ओवरलोड 7 ) वहां है: यह उस अस्थायी वस्तु की आवश्यकता को समाप्त करता है और इसे बनाने और नष्ट करने में शामिल ओवरहेड। "


8
और, पूर्णता के लिए, यदि यह अधिभार मौजूद नहीं था, तो तुलना अभी भी काम करेगी; संकलक प्रकार की एक अस्थायी वस्तु का निर्माण करेगा std::string from the C-style string and compare the two std :: स्ट्रिंग ऑब्जेक्ट। यही कारण है कि यह ऑपरेटर वहां है: यह उस अस्थायी वस्तु की आवश्यकता को समाप्त करता है और इसे बनाने और नष्ट करने में शामिल ओवरहेड।
पीट बेकर

1
@PeteBecker बेशक, मैंने इसे जवाब में जोड़ दिया है। इशारा करने के लिए धन्यवाद!
JeJo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.