2013-07-18 5 views
9

मैं एक वेक्टर बनाने की कोशिश कर रहा हूं जिसमें एक int और स्ट्रिंग है। क्या यह संभव है?एक वेक्टर बनाना जिसमें दो अलग-अलग डेटा प्रकार या कक्षाएं हैं

उदाहरण के लिए मैं vector<int>myArr चाहते प्रकार कोण कोष्ठक <> भीतर घोषित की string x= "Picture This"

+1

http://www.boost.org/doc/libs/1_54_0/doc/html/variant.html – chris

+0

संभव डुप्लिकेट [एक सरणी बनाना जो सी ++ में विभिन्न वर्गों की वस्तुओं को पकड़ सकता है] (http: // stackoverflow .com/प्रश्न/2764671/बनाने-एक-सरणी-जो-कैन-होल्ड-ऑब्जेक्ट-ऑफ-अलग-कक्षा-इन-सी) – hivert

+0

रुको, क्या आप चाहते हैं कि यह दोनों या तो एक int या स्ट्रिंग प्रत्येक तत्व में? – chris

उत्तर

2

चर नहीं, एक vector केवल होने चाहिए जिसे धारण करने के लिए।

आप एक वर्ग एक int सदस्य और एक string सदस्य वाले बना सकते हैं, और फिर एक vector बनाने उस वर्ग के उदाहरणों धारण करने के लिए, और फिर int या string सदस्यों को संदर्भित जब आप की जरूरत है।

+5

कक्षा में पॉइंटर्स को संग्रहीत करने की कोई आवश्यकता नहीं है। – chris

+0

@ क्रिसिस वेल, यह एप्लिकेशन पर निर्भर करेगा। –

+2

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

0

सं myArrint प्रकार धारण करने के लिए instantiated है। यह केवल int प्रकार स्टोर कर सकता है।

15

आप एक संघ का उपयोग कर सकते हैं, लेकिन बेहतर विकल्प हैं।

आप boost::variant उपयोग कर सकते हैं कार्यक्षमता के इस प्रकार प्राप्त करने के लिए:

using string_int = boost::variant<std::string, int>; 

std::vector<string_int> vec; 

या तो एक स्ट्रिंग या एक प्रकार के बाहर एक पूर्णांक के लिए, आप boost::get उपयोग कर सकते हैं:

std::string& my_string = boost::get<std::string>(vec[0]); 

संपादित
ठीक है, यह अब 2017 है। आपको अब variant रखने के लिए बूस्ट की आवश्यकता नहीं है, क्योंकि अब हमारे पास std::variant है!

+0

आप एक निश्चित आकार स्ट्रिंग ('कॉन्स char []') के साथ 'यूनियन' प्रकार का 'वेक्टर' बना सकते हैं और बिना किसी बूस्ट का उपयोग किए पूर्णांक को पूर्णांक बना सकते हैं। आप 'std :: string' का भी उपयोग कर सकते हैं लेकिन विनाशक को नष्ट करने के लिए सही प्रकार चुनने के लिए आपको एक प्रकार के टैग के साथ' struct' में 'यूनियन' की आवश्यकता है। मेरे उत्तर में लिंक का अंत देखें। – devil

+0

क्षमा करें, 'char []' के लिए 'const' की आवश्यकता नहीं है। – devil

+0

@devil बूस्ट का उपयोग करने के लिए _not_ के कुछ अच्छे कारण हैं। –

4

आप वेक्टर दो अलग अलग प्रकार धारण करने के लिए आप का उपयोग कर सकते हैं एक std::pair (या std::tuple यदि दो से अधिक)

C++ में 03:

std::vector<std::pair<int, std::string> > myArr; 

आप वेक्टर चाहते हैं एक प्रकार को पकड़ें जिसे दो अलग-अलग प्रकार के रूप में उपयोग किया जा सकता है: नहीं, यह नहीं किया जा सकता है।

9

हां दो अलग-अलग प्रकारों को पकड़ना संभव है, आप union प्रकारों के vector बना सकते हैं। इस्तेमाल की जाने वाली जगह प्रकारों का बड़ा होगा। यूनियन प्रकारों को here समझाया गया है कि आप किस प्रकार टैग कर सकते हैं। एक छोटा सा उदाहरण:

union Numeric 
{ 
    int i; 
    float f; 
}; 

std::vector<Numeric> someNumbers; 
Numeric n; 
n.i = 4; 
someNumbers.push_back(n); 

तुम भी std::string उपयोग कर सकते हैं, लेकिन आप नाशक नष्ट करने के लिए सही प्रकार का चयन करने के लिए एक प्रकार का टैग के साथ एक struct में union जगह की जरूरत है। लिंक का अंत देखें।

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