के फायदे यह एक बेवकूफ सवाल हो सकता है, मैं सामान्य रूप से सी ++ और प्रोग्रामिंग के लिए काफी नया हूं। मैं कई एसटीएल कंटेनर के उपयोग को समझना चाहता हूं और इसके साथ में, मैं सोच रहा था कि std :: set vs का उपयोग करने के फायदे वेक्टर या मानचित्र का उपयोग कर उदाहरण के लिए क्या हैं? मैं इस सवाल का स्पष्ट जवाब खोजने के लिए प्रतीत नहीं कर सकते हैं। मैंने देखा कि सेट नक्शे का उपयोग करते हैं, लेकिन फिर हमेशा नक्शे का उपयोग क्यों न करें या हमेशा सेट का उपयोग न करें। इसके बजाय 2 काफी समान कंटेनर प्रदान किए जाते हैं। अग्रिम धन्यवाद।std :: सेट बनाम वैक्टर या मानचित्र
उत्तर
std::set
और std::map
दोनों सहयोगी कंटेनर हैं। अंतर यह है कि std::set
रों, केवल कुंजी समाहित एक संबद्ध मूल्य नहीं होता है, जबकि std::map
में है। दूसरे पर एक का चयन मुख्य रूप से हाथ पर कार्य पर निर्भर करता है। यदि आप किसी पाठ में दिखाई देने वाले सभी शब्दों का एक शब्दकोश बनाना चाहते हैं, तो आप std::set<std::string>
का उपयोग कर सकते हैं, लेकिन यदि आप यह भी गिनना चाहते हैं कि प्रत्येक शब्द कितनी बार दिखाई देता है (यानी कुंजी को एक मान संबद्ध करें) तो आपको एक की आवश्यकता होगी std::map<std::string,int>
। आपको लगता है कि गिनती संबद्ध करने की आवश्यकता नहीं है, तो यह भावना int
कि अनावश्यक है है करने के लिए नहीं है।
आपको बहुत बहुत धन्यवाद, मुझे यह जानने की ज़रूरत है कि मुझे – brunodd
पता होना चाहिए यदि आप यह जांचना चाहते हैं कि 'सेट' में कोई मान मौजूद है या नहीं, तो यह जांचने के लिए तेज़ी से है कि' कुंजी 'में कोई कुंजी मौजूद है या नहीं? – thomthom
@ थॉथथॉम: आवश्यकताएं समान हैं, और अधिकांश कार्यान्वयन समान अंतर्निहित डेटा संरचना (आरबी-पेड़) का उपयोग करते हैं, इसलिए जवाब यह है कि सैद्धांतिक बिंदु और अभ्यास दोनों में लागत समान है। –
यह सम्मिलन, हटाने, पुनर्प्राप्ति इत्यादि के संबंध में आपके आवेदन के लिए सबसे अधिक वांछित जटिलता गारंटी के लिए आता है। मैं अत्यधिक अनुशंसा करता हूं स्कॉट मेयर्स के प्रभावी एसटीएल।
vector
कंटेनर के पीछे सम्मिलन और हटाने के लिए तेज़ है। आप ऑपरेटर के माध्यम से तत्वों का उपयोग कर सकते हैं []।dequeue
vector
के समान है लेकिन इसमें सामने सम्मिलन और हटाना शामिल है।set
केवल कुंजी है जबकिmap
मेंpair
है। इन दोनों कंटेनर कंटेनर के बीच में सम्मिलन और हटाने के लिए तेज़ हैं। आप एसटीएल एल्गोरिदम के साथ ढूंढकर तत्वों तक पहुंच सकते हैं।
एक सेट "typeOfFruits"
std::set<typeOfFruits> fruits;
fruits.insert (banana);
fruits.insert (apple);
fruits.insert (pineapple);
//it's fast to know if my store sells a type of fruit.
if (fruits.find (pear) == fruits.end())
{ std::cout<<"i don't have pear"; }
मानचित्र अद्वितीय चीजों के भंडारण के लिए उपयोगी है, के साथ साथ एक 'मान'
std::map<typeOfFruits, double /*unit price*/> fruits;
fruits[banana] = 1.05;
fruits[apple] = 0.85;
fruits[pineapple] = 3.05;
//repeating pineapple will replace the old price (value)
fruits[pineapple] = 3.35;
//it's fast to know how much a fruit costs.
std::map<typeOfFruits, double /*unit price*/> itr = fruits.find(pineapple);
if (itr != fruits.end())
{ std::cout<<"pineapples costs: $" <<itr->second; }
के लिए एक enum की तरह अद्वितीय चीजों के भंडारण के लिए उपयोगी है एक वेक्टर उन चीज़ों को संग्रहीत करने के लिए उपयोगी है जहां अनुक्रम का आदेश दिया गया है (push_back())। कल्पना करें कि आप एक चेकआउट में अपने फल स्कैनिंग कर रहे हैं, और कार्यक्रम के इस स्कैनिंग ट्रैक करता है।
std::vector<typeOfFruits> fruits;
fruits.push_back(apple);
fruits.push_back(apple);
fruits.push_back(apple);
fruits.push_back(banana);
fruits.push_back(banana);
fruits.push_back(pineapple);
//i scanned 3 apples, 2 bananas and 1 pineapple.
किसी भी शरीर ने तथ्यों का उल्लेख नहीं किया है कि std::set
वास्तव में अपरिवर्तनीय है। आपको इसमें किसी भी तत्व का मूल्य नहीं बदलना चाहिए। std::set
तो परिवर्तन से अधिक ट्रैक नहीं करता है जब आप इसे में एक तत्व आप अपनी पीठ के पीछे जाने के लिए और अपने आंतरिक क्रम बदलने के लिए की संभावना है संपादित करें। यह एक जोखिम भरा व्यवहार है। इसलिए std::map
उपयोग करें यदि आप तत्वों को संपादित करने के बाद आप उन्हें कंटेनर में डाल करना चाहते हैं। सुनिश्चित करें कि आप ऑर्डरिंग और value
में बाद में बदलने के लिए आवश्यक सभी चीज़ों को प्रेरित करने के लिए key
का उपयोग करें।
- 1. सी ++ std :: मानचित्र या std :: सेट - कुशलतापूर्वक डुप्लिकेट डालें
- 2. वैक्टर
- 3. आवंटित वैक्टर (या वैक्टरों के वैक्टर) गतिशील रूप से
- 4. रोटेशन वैक्टर बनाम quaternions
- 5. क्लोजर आलसी/सेट/वैक्टर बनाम आलसी संरचनाओं का प्रदर्शन?
- 6. जावास्क्रिप्ट मानचित्र ऑब्जेक्ट बनाम सेट ऑब्जेक्ट
- 7. std :: बनाम std :: shared_ptr बनाम std :: weak_ptr unique_ptr बनाम std :: auto_ptr कच्चे संकेत बनाम
- 8. std :: cin.getline() बनाम std ::
- 9. std :: मानचित्र थ्रेड-सुरक्षा
- 10. हडोप मानचित्र/कम बनाम बनाम मानचित्र/घटाएं
- 11. वैकल्पिक, इंटरवेव या दो वैक्टर
- 12. लूप के लिए क्लोजर, सेट को सेट या मानचित्र में
- 13. गतिशील सरणी बनाम एसटीएल वैक्टर सटीक अंतर?
- 14. पोर्टिंग std :: मानचित्र से सी?
- 15. std :: नक्शा डालने या std :: नक्शा ढूंढें?
- 16. मानचित्र बनाम मानचित्र एम व्यवहार
- 17. मानचित्र स्पष्ट बनाम शून्य
- 18. गुवा मल्टीसेट बनाम मानचित्र?
- 19. std :: स्ट्रिंग बनाम char *
- 20. मानचित्र बनाम starmap का प्रदर्शन?
- 21. सेट
- 22. वैक्टर
- 23. std :: स्ट्रिंग कुंजी बनाम int कुंजी के साथ std :: मानचित्र का उपयोग करने की लागत?
- 24. std :: सूची बनाम std :: वेक्टर पुनरावृत्ति
- 25. JQuery मानचित्र बनाम जावास्क्रिप्ट मानचित्र बनाम फॉर-लूप
- 26. QThread बनाम std :: thread
- 27. std :: size_t बनाम size_t बनाम std :: string :: size_type
- 28. std :: pair या std :: tuple
- 29. उप वैक्टर आरक्षण जबकि
- 30. Google मानचित्र एपीआई बनाम Google मानचित्र इंजन?
ए 'std :: set' बिना किसी मूल्य के' std :: map' के समान है, और 'std :: vector' से पूरी तरह से असंबंधित है ... –
आपको कुछ [अच्छे दस्तावेज़] की आवश्यकता है (http: // en.cppreference.com/w/)। –
वे सभी अलग-अलग चीजें करते हैं। अपनी समस्या को हल करने के लिए आपको जिसकी आवश्यकता है उसे चुनें।यह पूछने की तरह है कि हमें रसोई में नमक, मक्खन और चीनी क्यों रखना चाहिए और न केवल हमेशा नारंगी के रस का उपयोग करें। –