अगर std :: मैप में कोई कुंजी है बिना इंसर्ट किए कैसे चेक करें?


148

जिस तरह से मैंने डुप्लिकेट के लिए जाँच करने के लिए पाया है वह डालने और के std::pair.secondलिए जाँच करके है false, लेकिन समस्या यह है कि यह अभी भी कुछ सम्मिलित करता है यदि कुंजी अप्रयुक्त है, जबकि मैं जो चाहता हूं वह एक map.contains(key);फ़ंक्शन है।


5
डुप्लिकेट की कुंजी C ++ std :: map
OrangeDog

जवाबों:


305

का उपयोग करें my_map.count( key ); यह केवल 0 या 1 वापस कर सकता है, जो अनिवार्य रूप से बुलियन परिणाम है जो आप चाहते हैं।

वैकल्पिक रूप से my_map.find( key ) != my_map.end()भी काम करता है।


40
@ जॉन: प्रीमेच्योर ऑप्टिमाइज़ेशन का वह दौर जीसीसी पर (और मुझे यकीन है कि सबसे उचित सिस्टम), के map::countरूप में लागू किया गया है find(__x) == end() ? 0 : 1;। आपके लिए multimapएक प्रदर्शन तर्क हो सकता है, लेकिन यह ओपी का सवाल नहीं है और मैं अभी भी लालित्य पसंद करता हूं।
पोटैटोसवाटर

42
नहीं, समयपूर्व अनुकूलन तर्क केवल मान्य है यदि अनुकूलन कुछ प्रयास करता है जो इस मामले में नहीं करता है।
markh44

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

9
इससे पहले कि आप उन्हें इस्तेमाल करने की आदत डाल लें, लाइब्रेरी फंक्शंस की परफॉरमेंस से अवगत होना समयपूर्व अनुकूलन नहीं है। इस मामले में, आप सही हैं, इससे कोई फर्क नहीं पड़ता है, लेकिन न तो खोज और गिनती के बीच मामूली अंतर है। मुझे लगता है कि आप 'प्रीमेच्योर ऑप्टिमाइज़ेशन' संबंधी बयानबाजी को बहुत दूर तक ले जाते हैं। आपको रोज़मर्रा के विकास के लिए कोई भी "मुफ्त" अनुकूलन आदतें लेनी चाहिए और उनका उपयोग करना चाहिए। यह तब होता है जब कोडर्स पठनीयता / देव समय / इत्यादि में लागतों के जाल के आगे झुक जाते हैं, सभी अनसुने "प्रदर्शन लाभ" के लिए होते हैं जो समयपूर्व अनुकूलन बयानबाजी देने के लिए सही सलाह बन जाती है।
वोडस्टार

10
बहुत दूर, एसटीडी को बस एक लानत जोड़ना चाहिए has(k)/ contains(k)जैसे ग्रह पर हर दूसरे साने मैप क्लास। गरीब इंटरफेस डिजाइन। खोज () दृष्टिकोण बहुत क्रियात्मक है और count(k)दृष्टिकोण निश्चित रूप से शब्दार्थ समता पर नहीं है has(k)। उस बात के लिए न तो है find(k)। इस प्रश्न पर दृश्य गणना देखें।
जारोद स्मिथ

46

पोटैटोस्वाटर का उत्तर सब ठीक है, लेकिन मैं उपयोग करना पसंद करता हूं findया lower_boundइसके बजाय। lower_boundयह विशेष रूप से उपयोगी है क्योंकि बाद में लौटाए गए पुनरावृत्त को संकेतित प्रविष्टि के लिए उपयोग किया जा सकता है, क्या आपको उसी कुंजी के साथ कुछ डालने की इच्छा होनी चाहिए।

map<K, V>::iterator iter(my_map.lower_bound(key));
if (iter == my_map.end() || key < iter->first) {    // not found
    // ...
    my_map.insert(iter, make_pair(key, value));     // hinted insertion
} else {
    // ... use iter->second here
}

यह सूक्ष्म रूप से अलग है कि वह कैसे कहता है कि वह कर रहा है ... केवल अंतर यह है कि valueयदि प्रविष्टि अनावश्यक है तो गणना को छोड़ दिया जा सकता है।
पोटाटोस्वाटर

1
ज़रूर, मैं समझता हूँ कि ओपी डालने की परवाह नहीं करता है, इसलिए एक- lower_boundआधारित समाधान ओवरकिल है। मैंने अपने उत्तर का उल्लेख "पूर्णता के लिए" किया; जैसे मैंने कहा था, तुम्हारा स्वभाव पूरी तरह से पर्याप्त है। :-)
क्रिस जस्टर-यंग

4
हां, यह एक अच्छा जवाब है और मैं किसी भी चीज से असहमत नहीं हूं। बस insertएक प्राथमिकता के विकल्प के लिए रिश्ते को इंगित करता है । दरअसल, ए का उपयोग करने पर एक और अंतर है multimap, lower_boundविधि समतुल्य सीमा की शुरुआत में सम्मिलित होती है जबकि सादा insertविधि सीमा के अंत में जुड़ जाती है।
पोटाटोस्वाटर

2
प्रश्न का उत्तर नहीं है, लेकिन मेरा खराब प्रश्न मुझे यहाँ सही उत्तर की ओर ले जाता है ... मुझे इन्सर्ट / अपडेट करने की आवश्यकता है। : डी
हंटर-ओरियनोयर

1
@ शिकारी क्या आप मुझे अपना कोड दिखा सकते हैं? यदि यह बड़े पैमाने पर नहीं है, तो मैं शायद आपके लिए इसकी समीक्षा कर सकता हूं।
क्रिस जस्टर-यंग

9

आपका desideratum, map.contains(key)मसौदा मानक C ++ 2a के लिए निर्धारित है । 2017 में इसे gcc 9.2 द्वारा लागू किया गया था । यह वर्तमान क्लैंग में भी है ।


यह एक अच्छी सुविधा है! मुझे लगता है कि यह C ++ 20 पर उतरा है। cppreference.com
फ्रैंकलिन यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.