वहाँ एक (वैसे, कुछ हद तक असामान्य) स्थिति है जिसमें प्रपत्र तुम सच में प्रयोग कर एक फर्क कर सकते हैं है, और प्रपत्र आप उपयोग करना चाहते हैंusing namespace foo
है, और यह सबसे अधिक std
नाम स्थान पर लागू की गई (यानी, जहां using namespace std;
लिखें।
सबसे स्पष्ट उदाहरण है कि आप एक उपयोगकर्ता-निर्धारित प्रकार के लिए एक तरह से लिख रहे हैं है। यह संभव है कि यह एक प्रकार है जो के लिए उपयोगकर्ता भी परिभाषित किया गया है को लागू किया जाएगा उनके स्वयं swap
।
आप ऐसी परिस्थिति से फंस गए हैं जहां आप एक को परिभाषित करते हैं, तो वे अपने स्वैप का उपयोग करना चाहते हैं, लेकिन अगर उन्होंने परिभाषित नहीं किया है तो std :: स्वैप का उपयोग करें। यदि आप सीधे अपने कोड में std::swap
का उपयोग करते हैं, तो आप std::swap
का उपयोग कर समाप्त कर देंगे, भले ही इस प्रकार के स्वयं के परिभाषित स्वैप हैं। इसके विपरीत, यदि आप सीधे प्रकार के लिए एक स्वैप निर्दिष्ट करते हैं, तो आपका कोड संकलित करने में विफल रहेगा, और कोई भी आपूर्ति नहीं की गई है।
इस के आसपास पाने के लिए आपको करना कुछ की तरह:
using namespace std;
template <class Iter>
void my_sort(Iter first, Iter last) {
// ...
if (*last < *first)
swap(*first, *last);
}
इस प्रकार के लिए विशेष रूप स्वैप मिलेगा तुलना की जा रही (यानी, एक swap
उस प्रकार के रूप में ही नाम स्थान में परिभाषित), अगर वहाँ है एक (तर्क निर्भर लुकअप के माध्यम से), और std::swap
यदि किसी प्रकार के लिए परिभाषित नहीं किया गया है (using namespace std;
के माध्यम से)।
इसका प्रदर्शन पर असर पड़ सकता है - अगर उन्होंने विशेष रूप से अपने प्रकार के लिए एक स्वैप लिखा है, तो आप आमतौर पर उम्मीद कर सकते हैं कि ऐसा करने से, वे बेहतर प्रदर्शन प्रदान कर सकते हैं। इसका मतलब है कि std::swap
स्पष्ट रूप से निर्दिष्ट कर सकता है, लेकिन संभवतः कम प्रदर्शन का कारण बन जाएगा।
अन्यथा, यह लगभग पूरी तरह से सुविधा और पठनीयता की बात है - मैं ज्यादातर ऊपर दिए गए हालात को छोड़कर पूर्ण नाम (उदाहरण के लिए, std::swap
) देना पसंद करता हूं, जहां (जब मैं कोड लिख रहा हूं) कम से कम दो संभावनाओं को प्राथमिकता दी जा सकती है, और मैं सही चुनने के लिए संकलक को पर्याप्त छूट देना चाहता हूं।
अन्य बार जब मैं घोषणाओं/निर्देशों का उपयोग करता हूं तो उपयोगी होता है जब नामस्थान वास्तव में गहराई से घोंसला प्राप्त करते हैं। बूस्ट (एक स्पष्ट उदाहरण के लिए) में कुछ नाम हैं जो सुविधाजनक उपयोग के लिए बहुत लंबा रास्ता तय करेंगे यदि आपने हर बार पूरी तरह से योग्य नाम का उपयोग किया था। यह विशेष रूप से (अब, शुक्रिया, ज्यादातर अप्रचलित) बूस्ट लैम्ब्डा लाइब्रेरी के लिए सच था, जहां आपने _1
जैसे प्लेसहोल्डर्स का उपयोग किया था, जो boost::lambda::placeholders::_1
जैसे कुछ समाप्त हो गए थे (लेकिन मैं स्मृति से जा रहा हूं, इसलिए शायद कम से कम आंशिक रूप से गलत है) यदि आपने पूरी तरह से योग्य नाम का उपयोग करने पर जोर दिया है। यह पहली जगह में लैम्ब्डा लाइब्रेरी का उपयोग करने के उद्देश्य के एक बड़े हिस्से को हराया होगा।
यह रनटाइम प्रदर्शन से संबंधित नहीं है। –
मुझे बताया गया था कि जब मैं कॉलेज में था, तो 'नेमस्पेस std का उपयोग करके' नामस्थान में सभी नामस्थान रखने के अलावा, एक सुरक्षा गड़बड़ी भी थी। –
1. आपके द्वारा वर्णित कारण के लिए निराश किया गया है 2. एडीएल की सहायता से दूसरों द्वारा प्रदान किए गए कार्यों का उपयोग करने में आपकी सहायता करता है ('std :: swap' देखें, हालांकि एक उत्तर आपको बेहतर तरीके से समझाएं) 3। मैं सबसे ज्यादा पसंद करता हूं लेकिन यह स्वाद का विषय है और यदि आप मेरे स्थान पर 'std ::' को देखने के शौकीन नहीं हैं तो बोझिल हो सकता है। लेकिन उनमें से कोई भी प्रदर्शन अंतर नहीं है, वे सिर्फ नाम संकल्प के बारे में हैं और * "वास्तविक कोड में संकलित" नहीं मिलता है *। –