2012-06-15 15 views
15

क्या मेरे कोड में कोई समस्या है?क्या मैं int की एक सरणी को C++ वेक्टर पर धक्का दे सकता हूं?

std::vector<int[2]> weights; 
int weight[2] = {1,2}; 
weights.push_back(weight); 

यह संकलित नहीं किया जा सकता, स्पष्ट करने में मदद कृपया क्यों:

no matching function for call to ‘std::vector<int [2], std::allocator<int [2]> >::push_back(int*&)’ 
+8

यह 'std :: array ', std :: vector's, या' std :: pair's के वेक्टर के साथ काम करेगा। आपकी सरणी एक पॉइंटर को क्षय हो रही है जब यह गुजरती है, जिससे समस्याएं होती हैं। – chris

+0

धन्यवाद, क्रिस। मैं समझता हूँ कि। – MrROY

+0

मुझे लगता है कि यह एक अच्छा जवाब है कि यह सभी विनिर्देशों के साथ बाहर आने का इंतजार कर रहा है कि यह क्यों काम नहीं करता है, जो मुझे एक दिलचस्प और प्रबुद्ध पढ़ने मिलेगा। क्षय से ज्यादा इसके लिए है, लेकिन मुझे यकीन नहीं है कि वहां क्या है। – chris

उत्तर

27

एसटीएल कंटेनर में कारणों का उपयोग नहीं किया जा सकता है क्योंकि इसे प्रकार को रचनात्मक और असाइन करने योग्य प्रतिलिपि बनाने की आवश्यकता होती है (सी ++ 11 में भी रचनात्मक हो जाती है)। उदाहरण के लिए, आप सरणियों के साथ निम्न कार्य नहीं कर सकते हैं:

int a[10]; 
int b[10]; 
a = b; // Will not work! 

क्योंकि सरणियों आवश्यकताओं को पूरा नहीं करते हैं, वे नहीं किया जा सकता।

struct A { int weight[2];}; 
std::vector<A> v; 

हालांकि, यह शायद अगर आप बेहतर होगा: लेकिन, आप वास्तव में एक सरणी का उपयोग करने के लिए (जो शायद ऐसा नहीं है) की जरूरत है, तो आप इसे इतना की तरह एक वर्ग के एक सदस्य के रूप में जोड़ सकते हैं std::vector या std::array का उपयोग किया।

4

आप नहीं कर सकते कि बस करो।

यह बेहतर है आप इनमें से किसी का उपयोग करें:

  1. vector <vector<int>>

  2. vector<string> (स्ट्रिंग में एक सरणी है (यह मूल रूप से एक दो आयामी vector.It अपने मामले में काम करना चाहिए है), इसलिए आपको बाद में एक प्रकार कास्ट चाहिए। यह आसानी से हो सकता है।)।

    vector< S>

तो परोक्ष रूप से की struct S{int a[num]}, तो घोषित वेक्टर

  • आप एक संरचना घोषणा कर सकते हैं (एस कहते हैं) यह भीतर int प्रकार की सरणी होने यानी, आप एक में सरणी बढ़ा रहे हैं वेक्टर।

  • +1

    क्यों एक स्ट्रिंग? प्रश्न 'int' के जोड़े के बारे में है। – huon

    +0

    वाई आप स्ट्रिंग का उपयोग करते हैं? वाई वेक्टर नहीं? स्ट्रिंग प्रकार के –

    +0

    वेक्टर !! – vijay

    0

    बस एक ही विषय पर

    vector<int*> .That will definitely work. 
    

    एक प्रासंगिक चर्चा का उपयोग करें: Pushing an array into a vector

    +2

    यह संकलित करेगा। मुझे नहीं लगता कि यह ऐसा करेगा जो कोई तर्कसंगत रूप से करना चाहता है! यदि सरणी ढेर पर है, तो आपका समाधान दुर्घटनाग्रस्त हो जाएगा। –

    +0

    क्या आप मुझे बता सकते हैं क्यों नहीं? मैंने बस एक साधारण उदाहरण की कोशिश की, और यह अपेक्षित के रूप में काम किया। वेक्टर सिर्फ सरणी के शुरुआती पते को संग्रहीत करता है। इसलिए, यदि आप एनएच तत्व का उपयोग करना चाहते हैं, तो बस वेक्टर पर देखें, और nth स्थान पर जाएं। – Arvind

    +2

    @ अरविंद: ठीक है। और सब कुछ तब तक काम करता है जब तक कि सरणी गुंजाइश न हो, या आप उम्मीद करते हैं कि 'वेक्टर' की एक प्रति बनाना एक गहरी प्रतिलिपि बनाता है। फिर अजीब बातें हो रही हैं। – Managu

    4

    सरणी (इस मामले में vector) constructable नकल नहीं कर रहे हैं, ताकि आप उन्हें कंटेनरों में संग्रहीत नहीं कर सकता। आप एक नेस्टेड vector या सी ++ 11 में std::array स्टोर कर सकते हैं।

    +0

    बयान 'std :: vector वजन हैं; 'और' std :: वेक्टर वजन; समकक्ष? – twsaef

    +0

    नहीं, वे अलग-अलग प्रकार का नाम देते हैं और सरणी उस बिंदु पर पॉइंटर पर नहीं आती है। –

    -2

    वेक्टर को चालू करने के लिए, आपको एक प्रकार की आपूर्ति करने की आवश्यकता है, लेकिन int [2] एक प्रकार नहीं है, यह एक घोषणा है।

    +6

    'int [2] 'एक प्रकार है। यह 2 पूर्णांक की एक सरणी है। Arrays प्रकार भी हैं, बस अन्य भाषाओं में दृढ़ता से नहीं। – chris

    +0

    यदि यह एक प्रकार का था, तो घोषणा 'int [2] myvar नहीं होगी; '? –

    +2

    @RogerDahl: आप ऐसा सोचेंगे, लेकिन नहीं। आप टेम्पलेट्स बना सकते हैं जो 'int [2] 'को एक प्रकार ([उदाहरण] (http://ideone.com/1mzLP) स्वीकार करेंगे), यह केवल' std :: की आवश्यकताओं को पूरा करने के लिए नहीं होता है। vector'। तो इसका इस्तेमाल वहां नहीं किया जा सकता है। –

    4

    इस तरह के कंटेनर में ऐरे को भी जोड़ा जा सकता है।

    int arr[] = {16,2,77,29}; 
        std::vector<int> myvec (arr, arr + sizeof(arr)/sizeof(int)); 
    

    उम्मीद है कि यह किसी की सहायता करेगा।

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