2015-10-12 10 views
22

मेरे पास एक सी ++ प्रोग्राम है जिसमें मैं std::map में अनुपलब्ध किसी भी कुंजी के लिए डिफ़ॉल्ट मान डालना चाहता हूं। मैं सोच रहा हूं कि ऐसा करने का सबसे आसान तरीका std::map::operator[]() का उपयोग POSIX टच कमांड की तरह करना होगा - यानी, यदि यह पहले से मौजूद है तो मान अपरिवर्तित छोड़ने के लिए, लेकिन अगर ऐसा नहीं होता है तो इसे बनाने के लिए। example के लिए,क्या मैं std :: map :: ऑपरेटर [] पर भरोसा कर सकता हूं?

#include <map> 
#include <vector> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    vector<int> keys = {0, 1}; 

    map<int, int> m; 
    m[1] = 5; 
    m[2] = 12; 

    for (const int i : keys) 
    { 
     m[i]; // touch value 
    } 

    for (auto const & kv : m) 
    { 
     cout << kv.first << ", " << kv.second << endl; 
    } 
} 

मुझे यकीन है कि संकलक m[i]; बयान का अनुकूलन नहीं होगा, के बाद से मैं उनके साथ कुछ भी नहीं "कर" कर रहा हूँ हो सकता है? (स्पष्ट रूप से असाइन नहीं किया जा रहा है, पढ़ने से नहीं।)

उत्तर

17

हाँ आप सुनिश्चित हो सकते हैं। कॉल को अनुकूलित करने से आपके प्रोग्राम के अवलोकन योग्य व्यवहार में बदलाव आएगा, और संकलक को ऐसा करने की अनुमति नहीं है (आरवीओ के मामले में छोड़कर)।

इसे as-if rule के रूप में जाना जाता है।

+0

क्या आप एक स्रोत उद्धृत कर सकते हैं? –

+0

@ cp.engr संपादित देखें। –

+0

धन्यवाद। क्या मैं आपके जवाब में इस बिट को उद्धृत करने का सुझाव दे सकता हूं? "एक वास्तविक कार्यान्वयन को अभिव्यक्ति के हिस्से का मूल्यांकन करने की आवश्यकता नहीं है यदि यह कटौती कर सकती है कि इसका मूल्य उपयोग नहीं किया जाता है और कार्यक्रम के अवलोकन योग्य व्यवहार को प्रभावित करने वाले कोई दुष्प्रभाव उत्पन्न नहीं होते हैं।" आपके द्वारा लिंक किए गए स्वीकृत उत्तर में दूसरे ब्लॉकक्वाट से। –

5

[] ऑपरेटर वास्तव में उस कुंजी के स्थान पर डिफ़ॉल्ट रूप से डिफ़ॉल्ट रूप से निर्माण करता है जो कि आप इसे कुछ असाइन नहीं करते हैं।

Reference Link

कश्मीर कंटेनर में किसी भी तत्व के प्रमुख से मेल नहीं खाता, समारोह है कि कुंजी के साथ एक नए तत्व सम्मिलित करता है और अपने मैप किया मूल्य के लिए एक संदर्भ देता है, तो। ध्यान दें कि यह हमेशा कंटेनर आकार को एक से बढ़ाता है, भले ही कोई मैप किए गए मान तत्व को असाइन नहीं किया गया हो ( तत्व अपने डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग करके बनाया गया है)।

6

हां, आप सुनिश्चित हो सकते हैं। यह शायद अधिक सहज ज्ञान युक्त है जब आप समझते हैं कि प्रश्न में लाइन इस के बराबर है:

m.operator[](i); 

है & hellip; और आप मनमाने ढंग से समारोह की उम्मीद नहीं है अपने कार्यक्रम से बाहर अनुकूलित किया जाना करने के लिए कॉल, अगर वे कुछ भी कर।

संबंधित मुद्दे