2010-08-10 21 views
175

संभव डुप्लिकेट:
How to find an item in a std::vector?जांचें कि क्या std :: vector में कोई निश्चित वस्तु है?

वहाँ <algorithm> में जो कुछ करता है, तो एक std :: कंटेनर कुछ होता है आप की जाँच करने की अनुमति देता है? या, एक तरह से एक बनाने के लिए, उदाहरण के लिए:

if(a.x == b.x && a.y == b.y) 
return true; 

return false; 

यह केवल std::map साथ किया जा सकता है, क्योंकि यह कुंजी का उपयोग करता है?

धन्यवाद

+6

std :: ढूंढें ...... – sje397

+0

यदि इसमें कुछ विशिष्ट है, या बस यह खाली नहीं है? –

+2

आप किस सी ++ संदर्भ का उपयोग कर रहे हैं? और हेडर को '' कहा जाता है - नोट नंबर। एच। –

उत्तर

355

जांचना कि v तत्व x शामिल हैं:

#include <algorithm> 

if(std::find(v.begin(), v.end(), x) != v.end()) { 
    /* v contains x */ 
} else { 
    /* v does not contain x */ 
} 

जांचना कि v तत्वों (गैर खाली है) शामिल हैं:

if(!v.empty()){ 
    /* v is non-empty */ 
} else { 
    /* v is empty */ 
} 
+13

क्या होगा यदि x v में अंतिम तत्व है? –

+52

डेविड, एंड() अंक पिछले तत्व के पिछले एक बिंदु पर है, इसलिए यह सब काम करता है। –

+2

क्या यह निर्धारित करने की कोशिश करते समय संख्यात्मक सहिष्णुता के लिए यह खाता है कि वेक्टर में डबल है या नहीं? –

9

देखें प्रश्न: How to find an item in a std::vector?

तुम भी, यदि डिफ़ॉल्ट एक एक "गहरी" समानता परीक्षण के लिए पर्याप्त नहीं है सुनिश्चित करने के लिए आप अपने वस्तु के लिए एक उपयुक्त operator==() को क्रियान्वित किया है की आवश्यकता होगी ।

73

तो एक तत्व के लिए खोज महत्वपूर्ण है, मैं सलाह देते हैं के बजाय std::set। (। यानी myset.find(x)): इस का उपयोग करते हुए हे (एन) समय में

std::find(vec.begin(), vec.end(), x) रन, लेकिन std::set अपनी ही find() सदस्य है जो हे में चलता है (लॉग एन) समय - कि और अधिक तत्वों की बड़ी संख्या के साथ कुशल है

std::set यह भी गारंटी देता है कि सभी अतिरिक्त तत्व अद्वितीय हैं, जो आपको if not contained then push_back()... जैसी कुछ भी करने से बचाता है।

+1

ग्रेट !!! मैं एक लेक्सर लिख रहा हूँ। सेट वैक्टर से बेहतर होगा। क्या 'सेट' में 'map' जैसी 'गिनती' विधि है? मैं भी एक सेट में तत्व की अनुक्रमणिका प्राप्त करने में सक्षम होना चाहता हूं। – IAbstract

+1

उत्कृष्ट जानकारी! दोनों सीधे प्रश्न का उत्तर देने और अतिरिक्त समाधान प्रदान करने के लिए धन्यवाद। – CodeMouse92

+3

यह बुरी सलाह है। यदि प्रदर्शन महत्वपूर्ण है, प्रोफ़ाइल। इस बात की कोई गारंटी नहीं है कि जटिलता विश्लेषण में आपकी विशिष्ट समस्या के बारे में कुछ भी कहना है। –

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