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


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.