2009-04-16 9 views
7

मैं प्रोग्राम सीख रहा हूं, और सी ++ मेरी पहली भाषा है। मुझे दिखाने के लिए पॉइंटर्स का उपयोग करके परेशान न करें - मैं उन्हें अभी तक समझ नहीं पा रहा हूं, और इससे परेशान नहीं होगा जब तक कि मेरे पास समर्पित करने के लिए अधिक खाली समय न हो।क्या आप प्रारंभ करने के बाद सी ++ सरणी का आकार बदल सकते हैं?

int mergeSort() 
{ 
    const int n = 9; 
    int originalarray[n] = {1, 3, 5, 7, 9, 2, 4, 6, 8}; 


    const int halfelements = (sizeof(originalarray)/sizeof(int))/2; 
    int farray[halfelements]; 
    int sarray[halfelements]; 

    for (int i = 0; i < halfelements; i++) { 
     farray[i] = originalarray[i]; 
    } 

    for (int i = halfelements, x = 0; i < (halfelements * 2); i++, x++) { 
     sarray[x] = originalarray[i]; 
    } 

मैं सौंपा गया था (मैं नहीं ले रही हूँ कक्षाएं - बस कुछ ही दोस्तों ने मुझे बाहर की मदद करने के साथ सीखने) किसी मर्ज तरह एल्गोरिथ्म, एल्गोरिथ्म के साथ समझाया लेकिन नहीं कार्यान्वयन। मैं इसे फिर से लिखना चाहता हूं ताकि यह अजीब और यहां तक ​​कि पूर्णांक दोनों के लिए काम करेगा। मैंने इस कोड को जोड़ने का प्रयास किया:

if ((n % 2) != 0) int farray[halfelements + 1]; 

ताकि मैं बाद के सरणी दोनों में पुनरावृत्त करने के लिए एक ही पूर्णांक का उपयोग कर सकूं। एक आकार (farray) 16 बाइट्स, या 4 पूर्णांक होने के लिए दिखा रहा है। तो यह आकार बदल नहीं रहा है। मैं क्या जानना चाहता हूं - क्या प्रारंभ होने के बाद सरणी का आकार बदलना संभव है?

संपादित करें: मैं एक वेक्टर को कैसे कार्यान्वित करूं? मैं समझ नहीं पा रहा हूं कि लूप में इटरेटर्स का उपयोग कैसे करें और मूल्यों की प्रतिलिपि बनाएँ।

उत्तर

16

सी ++ सरणी आकार में तय की गई हैं।

यदि आपको "आकार बदलने योग्य सरणी" की आवश्यकता है, तो आप किसी सरणी के बजाय std::vector का उपयोग करना चाहेंगे।

+0

ठीक है, धन्यवाद। मैंने यह पता लगाया है कि आप इस एल्गोरिदम में std :: vector को कैसे कार्यान्वित करेंगे।हालांकि मेरी इच्छा है कि मैंने अपने कोड को दोबारा डिबग करने में बिताया नहीं है, बस मेरे फंक्शन हेडर को समझने के लिए "int mergeSort (std :: vector, int)" में एक "" =/ – jkeys

+0

गायब नहीं था 'वेक्टर की समर्थित नहीं है गतिशील सरणी द्वारा वैसे भी? गतिशील रूप से एक सरणी या वेक्टर को फिर से आकार देने के लिए एक ही प्रदर्शन दंड सही होना चाहिए> – Jason

1

यदि आप किसी सरणी का आकार बदलना चाहते हैं, तो आप शायद वेक्टर का उपयोग करना चाहते हैं, जिसे स्वचालित रूप से आकार दिया जा सकता है।

4

मेरी सलाह भी मजबूत है: std::vector<> (et। Al।) का उपयोग करें जब तक कि आपके पास सी-स्टाइल सरणी का उपयोग करने का कोई अच्छा कारण न हो। चूंकि आप सी ++ सीख रहे हैं, मुझे संदेह है कि आपके पास ऐसा कारण है: std::vector<> का उपयोग करें।

+0

एक वेक्टर को संयोजित भंडारण का उपयोग करने के लिए गारेन किया जाता है, भले ही पॉइंटर लेने वाली विधि से गुज़रने पर आप एक वेक्टर का उपयोग कर सकें। डेटा को आकार देने के तरीके के लिए केवल एक पॉइंटर को संदर्भ/पॉइंटर पास करते समय आप कच्ची मेमोरी का उपयोग करके फंस जाते हैं। – Richard

1

आप एक वेक्टर के साथ [] ऑपरेटर का उपयोग उसी तरह से कर सकते हैं जैसा आप किसी सरणी में करेंगे। आप इस प्रकार का वेक्टर कुछ के साथ इसे लागू कर सकता है (यदि आप और अधिक वेक्टर तरीकों का उपयोग करना चाहता था):

#include <vector> 

const int halfelements = originalarray.size()/2; //use size to get size 
vector <int> farray(halfelements); 
vector <int> farray(halfelements); 

for (int i = 0; i < halfelements; i++) { 
    farray.push_back(originalarray[i]); //adds element at i to the end of vector 
} 

for (int i = halfelements, x = 0; i < (halfelements * 2); i++, x++) { 
    sarray.push_back(originalarray[i]); 
} 

तुम भी सीमा वेक्टर उपयोग करने के लिए जाँच जोड़ने के लिए (इंडेक्स) .at उपयोग कर सकते हैं।

+0

कृपया कोड के लिए "प्री" एचटीएमएल टैग का उपयोग न करें - इसके बजाय, अपने माउस के साथ कोड का चयन करें और ctrl-k टाइप करें या कोड आइकन –

+0

पर क्लिक करें, उसे वेक्टर (इटर, इटर) कन्स्ट्रक्टर का उपयोग करना चाहिए। वेक्टर farray (originalarray.begin(), और मूलराय [आधा]), सररे (और मूलराय [आधा], originalarray.end()); यह बाद में प्रति को समाप्त करता है। लेकिन यह शायद भ्रमित है। – jmucchiello

0

आप जानना चाहते हैं क्यों अपना पहला विचार संकलित लेकिन काम करने के लिए नहीं लगता था:

if ((n % 2) != 0) int farray[halfelements + 1]; 

यह बस के रूप में यदि आप एक ही है: जब आप किसी अगर-बयान में ब्रेसिज़ छोड़

'उन्हें इस्तेमाल किया डी:

if ((n % 2) != 0) { 
    int farray[halfelements + 1]; 
} 

इसलिए यह एक बना रही है' सही आकार के farray '- और फिर इसे तुरंत क्षेत्र से बाहर चला जाता है और चला गया है, और आप केवल मूल एक साथ छोड़ दिया रहे हैं।

2

मैं std::vector की भी सिफारिश करता हूं। हालांकि यदि आप किसी सरणी से फंस गए हैं तो आप हमेशा malloc मेमोरी और फिर realloc कर सकते हैं यदि आपको सरणी को बड़ा बनाना है।

एसओ पर यहां एक खोज करें, malloc और realloc के बारे में जानकारी है।

+0

मैं भी इस सम्मेलन का उपयोग करता हूं। – Hydro

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

  • कोई संबंधित समस्या नहीं^_^