2013-04-29 4 views
33

के फायदे यह एक बेवकूफ सवाल हो सकता है, मैं सामान्य रूप से सी ++ और प्रोग्रामिंग के लिए काफी नया हूं। मैं कई एसटीएल कंटेनर के उपयोग को समझना चाहता हूं और इसके साथ में, मैं सोच रहा था कि std :: set vs का उपयोग करने के फायदे वेक्टर या मानचित्र का उपयोग कर उदाहरण के लिए क्या हैं? मैं इस सवाल का स्पष्ट जवाब खोजने के लिए प्रतीत नहीं कर सकते हैं। मैंने देखा कि सेट नक्शे का उपयोग करते हैं, लेकिन फिर हमेशा नक्शे का उपयोग क्यों न करें या हमेशा सेट का उपयोग न करें। इसके बजाय 2 काफी समान कंटेनर प्रदान किए जाते हैं। अग्रिम धन्यवाद।std :: सेट बनाम वैक्टर या मानचित्र

+1

ए 'std :: set' बिना किसी मूल्य के' std :: map' के समान है, और 'std :: vector' से पूरी तरह से असंबंधित है ... –

+0

आपको कुछ [अच्छे दस्तावेज़] की आवश्यकता है (http: // en.cppreference.com/w/)। –

+6

वे सभी अलग-अलग चीजें करते हैं। अपनी समस्या को हल करने के लिए आपको जिसकी आवश्यकता है उसे चुनें।यह पूछने की तरह है कि हमें रसोई में नमक, मक्खन और चीनी क्यों रखना चाहिए और न केवल हमेशा नारंगी के रस का उपयोग करें। –

उत्तर

55

std::set और std::map दोनों सहयोगी कंटेनर हैं। अंतर यह है कि std::set रों, केवल कुंजी समाहित एक संबद्ध मूल्य नहीं होता है, जबकि std::map में है। दूसरे पर एक का चयन मुख्य रूप से हाथ पर कार्य पर निर्भर करता है। यदि आप किसी पाठ में दिखाई देने वाले सभी शब्दों का एक शब्दकोश बनाना चाहते हैं, तो आप std::set<std::string> का उपयोग कर सकते हैं, लेकिन यदि आप यह भी गिनना चाहते हैं कि प्रत्येक शब्द कितनी बार दिखाई देता है (यानी कुंजी को एक मान संबद्ध करें) तो आपको एक की आवश्यकता होगी std::map<std::string,int>। आपको लगता है कि गिनती संबद्ध करने की आवश्यकता नहीं है, तो यह भावना int कि अनावश्यक है है करने के लिए नहीं है।

+0

आपको बहुत बहुत धन्यवाद, मुझे यह जानने की ज़रूरत है कि मुझे – brunodd

+0

पता होना चाहिए यदि आप यह जांचना चाहते हैं कि 'सेट' में कोई मान मौजूद है या नहीं, तो यह जांचने के लिए तेज़ी से है कि' कुंजी 'में कोई कुंजी मौजूद है या नहीं? – thomthom

+0

@ थॉथथॉम: आवश्यकताएं समान हैं, और अधिकांश कार्यान्वयन समान अंतर्निहित डेटा संरचना (आरबी-पेड़) का उपयोग करते हैं, इसलिए जवाब यह है कि सैद्धांतिक बिंदु और अभ्यास दोनों में लागत समान है। –

1

यह सम्मिलन, हटाने, पुनर्प्राप्ति इत्यादि के संबंध में आपके आवेदन के लिए सबसे अधिक वांछित जटिलता गारंटी के लिए आता है। मैं अत्यधिक अनुशंसा करता हूं स्कॉट मेयर्स के प्रभावी एसटीएल

2
  • vector कंटेनर के पीछे सम्मिलन और हटाने के लिए तेज़ है। आप ऑपरेटर के माध्यम से तत्वों का उपयोग कर सकते हैं []।
  • dequeuevector के समान है लेकिन इसमें सामने सम्मिलन और हटाना शामिल है।
  • set केवल कुंजी है जबकि map में pair है। इन दोनों कंटेनर कंटेनर के बीच में सम्मिलन और हटाने के लिए तेज़ हैं। आप एसटीएल एल्गोरिदम के साथ ढूंढकर तत्वों तक पहुंच सकते हैं।
21

एक सेट "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. 
2

किसी भी शरीर ने तथ्यों का उल्लेख नहीं किया है कि std::set वास्तव में अपरिवर्तनीय है। आपको इसमें किसी भी तत्व का मूल्य नहीं बदलना चाहिए। std::set तो परिवर्तन से अधिक ट्रैक नहीं करता है जब आप इसे में एक तत्व आप अपनी पीठ के पीछे जाने के लिए और अपने आंतरिक क्रम बदलने के लिए की संभावना है संपादित करें। यह एक जोखिम भरा व्यवहार है। इसलिए std::map उपयोग करें यदि आप तत्वों को संपादित करने के बाद आप उन्हें कंटेनर में डाल करना चाहते हैं। सुनिश्चित करें कि आप ऑर्डरिंग और value में बाद में बदलने के लिए आवश्यक सभी चीज़ों को प्रेरित करने के लिए key का उपयोग करें।

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