2010-05-06 17 views
43

मेरे उपयोग के मामले:std :: map में कोई तत्व मौजूद है या नहीं?

map<string, Car> cars; 
bool exists(const string& name) { 
    // somehow I should find whether my MAP has a car 
    // with the name provided 
    return false; 
} 

आप कृपया सबसे अच्छा और C++ में यह करने के लिए सबसे खूबसूरत तरीका सुझाव है कि कर सकते हैं? धन्यवाद।

उत्तर

42

ज़रूर, पुनरावर्तक

map<string,Car>::const_iterator it = cars.find(name); 
return it!=cars.end(); 
+5

चूंकि आप 'कार' को म्यूट नहीं कर रहे हैं, इसलिए 'const_iterator' प्राप्त करना बेहतर है। – kennytm

+0

अच्छा बिंदु। संपादन .... – Tom

+0

लेकिन अगर 'कार' नहीं है, तो 'कारें। नाम (नाम)' एक 'इटरेटर' वापस कर देगा जिसे 'const_iterator' में परिवर्तित किया जाना है और' cars.end() 'वापस आ जाएगा एक 'iterator' जिसे तब 'it' की तुलना में' const_iterator 'में परिवर्तित कर दिया जाएगा। इसे क्यों लड़ो; क्यों न केवल 'इटरेटर' का उपयोग करें? –

5
bool exists(const string& name) 
{ 
    return cars.find(name) != cars.end(); 
} 
+0

यदि यह सदस्य है तो फ़ंक्शन 'const' बनाएं? –

+1

यदि यह सदस्य है, तो हाँ। –

70
return cars.find(name) != cars.end(); 
+0

यह वह जवाब है जिसका मैं उपयोग करूंगा! –

1
bool exists(const std::map<std::string, Car>& cars, const std::string& name) { 
    return cars.end() != cars.find(name); 
} 
+0

इसे टेम्पलेट फ़ंक्शन बनाकर इसे और अधिक सामान्य क्यों नहीं बनाते? लेकिन यह संभवतः लालित्य की आवश्यकता को पूरा नहीं करेगा .. – foraidt

+0

@ एमएक्सपी, इसके लिए मेरा समाधान देखें (http://stackoverflow.com/questions/2781899/how-to-find-whether-an-element-exists -इन-stdmap/2782084 # 2782084)। –

2

std::map::find(const key_type& x);

यह रिटर्न map::end यदि आइटम मौजूद नहीं है का उपयोग करें।

21

तुम भी इस्तेमाल कर सकते हैं

bool exists(const string& name) { 
    return cars.count(name) != 0; 
} 
+0

'! = 0' वैकल्पिक। – Potatoswatter

+12

@Potatoswatter लेकिन यह स्पष्ट करता है कि वास्तव में क्या परीक्षण किया जा रहा है। यह पूरी तरह से एक स्टाइलिस्ट मुद्दा है, लेकिन मैं बूल रूपांतरणों के लिए अंतर्निहित int पर भरोसा नहीं करता हूं। – KeithB

+4

@Potatoswatter: स्पष्ट तुलना एक वीसी ++ चेतावनी को दबाएगी ("प्रदर्शन चेतावनी: बूल को पूर्णांक मजबूर करना"); – UncleBens

7

के बारे में क्या: std::find के माध्यम से

template <typename KeyType, typename Collection> 
bool exists_in(Collection const& haystack, KeyType const& needle) { 
    return std::find(haystack.begin(), haystack.end(), needle) != haystack.end(); 
} 

template <typename K, typename V> 
bool exists_in(std::map<K,V> const& haystack, K const& needle) { 
    return haystack.find(needle) != haystack.end(); 
} 

यह किसी भी मानक कंटेनर के साथ exists_in काम करता है और std::map के लिए एक विशेष संस्करण का उपयोग के बाद से यह एक अधिक कुशल खोज विकल्प प्रदान करता है । आप आवश्यकतानुसार अतिरिक्त विशेषज्ञता जोड़ सकते हैं (उदाहरण के लिए, std::set और अन्य के लिए)।

+4

कॉन्स्ट संदर्भ द्वारा सबकुछ पास करें। – UncleBens

15

इटेटरेटर के साथ उत्तरों के अलावा-() से तुलना करें() और .end() की तुलना में, एक और तरीका है: map :: count।

आप एक विशिष्ट कुंजी के साथ मानचित्र :: गिनती (कुंजी) को कॉल कर सकते हैं; यह वापस लौटाएगा कि दी गई कुंजी के लिए कितनी प्रविष्टियां मौजूद हैं। अद्वितीय कुंजी वाले मानचित्रों के लिए, परिणाम या तो 0 या 1 होगा। चूंकि मल्टीमैप एक ही इंटरफ़ेस के साथ-साथ मौजूद है, इसलिए सुरक्षित पक्ष पर होने के लिए अस्तित्व के लिए बेहतर तुलना करें!

अपने उदाहरण के लिए

, कि

return (cars.count(name)>0); 

फायदे मैं देख रहा हूँ 1. कम कोड, 2. लाभ जो कुछ अनुकूलन से पुस्तकालय आंतरिक रूप से आवेदन कर सकते हैं, उसकी प्रस्तुति के विवरण का उपयोग कर रहे हैं है।

0
#define itertype(v) typeof((v).begin()) 
itertype(cars) it = cars.find(name); 
return it != cars.end(); 
+0

आप इस मैक्रो के बजाय 'ऑटो' का उपयोग क्यों नहीं करेंगे? 'ऑटो इसे = car.find (नाम); ' –

+0

एसओ में आपका स्वागत है। यह उत्तर वास्तव में कुछ भी नया नहीं जोड़ता है जो पहले से ही (पुराने) मौजूदा उत्तरों में शामिल नहीं है। अपने उत्तर को हटाने पर विचार करें और शायद उन सवालों के जवाब देने के लिए देखें जिनके जवाब अभी तक स्वीकार नहीं किए गए हैं। –

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