2010-06-08 2 views
6

में वेक्टर के लिए कोई खोज क्यों नहीं है वैकल्पिक विकल्प क्या है?सी ++

क्या मुझे अपने आप लिखना चाहिए?

+1

शायद आपको परिभाषित करना चाहिए कि "ढूंढने" का क्या इरादा है? – KevenK

+20

एक 'std :: find' है। Http://stackoverflow.com/questions/571394/how-to-find-an-item-in-a-stdvector/571405#571405 – meagar

+13

एसटीएल की सुंदरता ग्लूइंग द्वारा किए गए कंटेनर और एल्गोरिदम__ के __decoupling में निहित है उन्हें इटरेटर के साथ मिलकर। यह एक _Deliberate डिजाइन निर्णय_ है, जो मैंने कभी देखा है सभी ओओ पुस्तकालयों की तुलना में _higher abstractions_ की ओर जाता है। यदि आप एक कठोर ओओ पृष्ठभूमि (जावा, सी #) से आते हैं, तो यह पहले अजीब लग सकता है, लेकिन _it निश्चित रूप से सीखने योग्य है। – sbi

उत्तर

41

, std::find() एल्गोरिथ्म, जो एक इटरेटर सीमा पर एक रेखीय खोज करता है जैसे,

std::vector<int> v; 

// Finds the first element in the vector that has the value 42: 
// If there is no such value, it == v.end() 
std::vector<int>::const_iterator it = std::find(v.begin(), v.end(), 42); 

अपने वेक्टर सॉर्ट हो जाता है, तो आप std::binary_search() उपयोग कर सकते हैं परीक्षण करने के लिए है कि क्या मान वेक्टर में मौजूद है, और std::equal_range() वेक्टर में तत्वों की श्रेणी के लिए शुरू करने और इसे समाप्त करने के लिए उस मूल्य वाले हैं।

+3

एक मुफ्त फ़ंक्शन के रूप में 'std :: find' होने का लाभ यह है कि यह मेमोरी सरणी, 'std :: vector', या किसी भी अन्य कंटेनर में काम करेगा जो रैखिक रूप से ट्रैवर्स किया जा सकता है। – Thanatos

+0

हालांकि आप इसे "बहु-थ्रेड" कर सकते हैं। –

+0

आप केवल एक निरंतर कारक सुधार देखेंगे। इसके अलावा, यह 'std :: find' क्या करता है के दायरे से बाहर है। (अधिकांश स्थितियों में एक बहु थ्रेडेड खोज की आवश्यकता नहीं है।) आप एक 'समानांतर_फिंड()' लिख सकते हैं जो बहुत समान काम करता है, हालांकि, और उन सभी कंटेनरों पर काम करेगा जो कुछ सेट (काफी ढीले) आवश्यकताओं को पूरा करते हैं। – Thanatos

4

std::find(vec.begin(), vec.end(), value) का उपयोग करें।

और भूल नहीं है शामिल करने के लिए<algorithm>

8

तुम कौन से कहा कि? C++ में vector के लिए "ढूंढें" एल्गोरिदम है। विडंबनात्मक रूप से संयोग से, इसे std::find कहा जाता है। या शायद std::binary_search। या कुछ और, आपके वेक्टर में संग्रहीत डेटा के गुणों के आधार पर।

कंटेनर जेनेरिक एल्गोरिदम (कंटेनर विधियों के रूप में लागू) के अपने विशिष्ट संस्करण प्राप्त करते हैं, जब एल्गोरिदम का प्रभावी कार्यान्वयन किसी भी तरह कंटेनर के आंतरिक विवरण से जुड़ा होता है। std::list<>::sort एक उदाहरण होगा।

अन्य सभी मामलों में, एल्गोरिदम स्टैंडअलोन फ़ंक्शंस द्वारा कार्यान्वित किए जाते हैं। std::find पर कोई एल्गोरिथम लाभ (std::findO(N) है और सामान्य रूप में, आप वैक्टर के लिए बेहतर नहीं कर सकता) है, क्योंकि

+0

नाइटपिक के लिए खेद है, लेकिन "ढूंढें" नामक एक खोज फ़ंक्शन के बारे में इतना विडंबनापूर्ण क्या है? – jalf

+0

@jalf: मुझे लगता है कि यह व्यंग्यात्मक रूप से इरादा था ... यह इंगित करते हुए कि ओपी शिकायत कर रहा है कि "ढूंढने" के दौरान कोई "ढूंढें" नहीं है और "सी ++ ढूंढने" के लिए Google खोज दूसरे परिणाम को ' std :: find' cplusplus.com पर – KevenK

+3

तो व्यंग्यात्मक रूप से कुछ विडंबनापूर्ण कह रहा है ... मैन, वह गहरा है। ;) – jalf

21

कारण कोई vector::find है।

लेकिन कारण आप map::find है क्योंकि यह अधिक कुशल हो सकता (map::findO(log N) ताकि आप हमेशा का उपयोग करना चाहते हैं कि नक्शे के लिए std::find खत्म हो गया है)।

+0

यदि वेक्टर सॉर्ट किया गया है तो आप निश्चित रूप से ओ (एन) से बेहतर कर सकते हैं। – moodboom

2

विकल्प क्या है?

मानक जैसे तत्वों (या ऐसा कुछ) के मनमाना अनुक्रमों पर क्रमिक खोज के लिए std :: find प्रदान करता है।

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

सी ++ में वेक्टर के लिए कोई खोज क्यों नहीं है?

std::vector<???>::find बनाने में कोई मतलब नहीं था क्योंकि कार्यान्वयन std::find(vector.begin(), vector.end(), value_to_find); के समान होगा।

क्या मुझे अपने आप लिखना चाहिए?

सं।जब तक आपके पास विशिष्ट सीमाएं या आवश्यकताएं न हों, आपको जब भी संभव हो एसटीएल कार्यान्वयन का उपयोग करना चाहिए।

3

कंटेनर क्लास में 'ढूंढें' कार्यक्षमता होने से 'SRP' (एकल उत्तरदायित्व सिद्धांत) का उल्लंघन होता है। एक कंटेनर की मुख्य कार्यक्षमता भंडारण, कंटेनर में तत्वों की पुनर्प्राप्ति के लिए इंटरफेस प्रदान करना है। 'ढूँढना', 'छंटनी', 'इटरेटिंग' आदि किसी भी कंटेनर की मुख्य कार्यक्षमता नहीं हैं और इसलिए इसका प्रत्यक्ष इंटरफ़ेस का हिस्सा नहीं है।

हालांकि Namespace Principle में 'हर्ब' राज्यों के रूप में, 'खोज' उसी नामस्थान में 'वेक्टर' अर्थात 'std' के रूप में परिभाषित करके इंटरफेस का एक हिस्सा है।

+1

हालांकि, यह एक कंटेनर के लिए पूरी तरह से उपयुक्त है कि वह अपना 'ढूंढ' फ़ंक्शन _if_ प्रदान करे, यह जेनेरिक 'std :: find' एल्गोरिदम से बेहतर प्रदर्शन करता है (' std :: map :: find' पर विचार करें)। –