2012-02-25 15 views
5

कहता है कि मैं युगल की एक सरणी के माध्यम से पुनरावृत्ति करना चाहता हूं और उन्हें जोड़ना चाहता हूं। मेरे पास ऐसा करने के दो तरीके हैं।सी ++ सरणी पॉइंटर्स [] या ++

एक)

double sum (double * series, int size) { 
    double sum = 0.0; 
    for (int i = 0; i < size; i++) { 
     sum += *series++; 
    } 
    return sum; 
} 

बी)

double sum (double * series, int size) { 
    double sum = 0.0; 
    for (int i = 0; i < size; i++) { 
     sum += series[i]; 
    } 
    return sum; 
} 

जो बेहतर है और क्यों है/जब मैं एक दूसरे के ऊपर का उपयोग करना चाहिए।

+0

मुझे बी पसंद है) क्योंकि यह समझने में छोटा और आसान है कि आप नहीं जानते कि पॉइंटर्स कैसे काम करते हैं। आप std :: accumulate के साथ वैक्टर का भी उपयोग कर सकते हैं। – chris

+0

स्टाइल ए मुझे उतना स्पष्ट नहीं है कि आप क्या हासिल कर रहे हैं। निजी तौर पर, मैं हमेशा सी # पृष्ठभूमि से आने वाली स्टाइल बी का चयन करता हूं। –

+0

@ रिचर्ड जे। रॉस III, '* श्रृंखला 'उस श्रृंखला में निहित डेटा का मूल्यांकन करती है जो सीरीज़ इंगित कर रही है। लूप वृद्धि श्रृंखला है, इसलिए यह प्रत्येक बार सरणी में अगले तत्व को इंगित करता है। – chris

उत्तर

6

यह पठनीयता का सवाल है, इसे प्रदर्शन को प्रभावित नहीं करना चाहिए। मुझे लगता है कि बी सबसे अधिक पठनीय है, और इसलिए बेहतर है।

double sum (double* begin, double* end) { 
    double sum = 0.; 
    for (double* it = begin; it != end; ++it) { 
     sum += *it; 
    } 
    return sum; 
} 

यह मुहावरेदार सी ++ कई मामलों में है और अधिक आसानी से सामान्यीकरण करता:

मैं भी एक तिहाई संस्करण है, जो सीमा के आधार पर है (ध्यान दें begin और end पैरामीटर) का प्रस्ताव कर सकते हैं। यह कहना नहीं है कि यह हमेशा बेहतर है, यह पठनीयता और रखरखाव के बारे में एक प्रश्न में एक और प्रकार है।

+0

हाँ, यह मूल रूप से std :: संचय वैक्टर के साथ करता है। – chris

+0

आइए आशा करते हैं कि 'शुरू करें' '' '' end'। क्या होता है यदि 'start'' == '' end'? –

+1

@ सिमन राइट: फिर यह लूप में प्रवेश नहीं करेगा, और तुरंत 0 लौटाएगा। शरीर में प्रवेश करने से पहले लूप की स्थिति की जांच की जाती है :) –

4

न तो दूसरे की तुलना में स्वाभाविक रूप से बेहतर है; आपको जो भी अपना कोड स्पष्ट करने का इरादा रखता है उसे चुनना चाहिए। किसी भी आधुनिक कंपाइलर के साथ, उन्हें समान मशीन कोड के लिए अनुकूलित किया जाना चाहिए।


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

1

प्रदर्शन के संदर्भ में आधुनिक अनुकूलन संकलन का उपयोग करते समय कोई अंतर नहीं होना चाहिए।

1 9 78 में, पीडीपी -11 पर पहला रास्ता कुछ तेज था, क्योंकि अप्रत्यक्ष ऑटोइनक्रिकमेंट एड्रेसिंग को प्रक्रिया के लिए कम चक्र की आवश्यकता होती थी, और कोई ऑप्टिमाइज़र नहीं था जो इंडेक्स + ऑफ़सेट को ऑटोइनक्रिकमेंट में परिवर्तित करने में सक्षम था।

पीएस series -= size; को सेट करना कोई प्रभाव नहीं है, क्योंकि series मूल्य से पारित किया गया है।

+0

श्रृंखला - = आकार; श्रृंखला को पहले आइटम पर वापस इंगित करने के लिए सेट करता है? –

+1

@PatrickLorio हां, लेकिन यह सूचक की * प्रति * पर करता है, जो मूल्य से गुजरता है। चूंकि आप असाइनमेंट के बाद 'श्रृंखला' तक पहुंच के बिना अगली पंक्ति पर लौट रहे हैं, इसलिए इस असाइनमेंट का कोई प्रभाव नहीं पड़ता है। यह समझ में आता है कि यदि आप उस सूचक * फिर से * का उपयोग करना चाहते थे, उदाहरण के लिए योग खोजने के अलावा सबसे बड़ा या सबसे छोटा तत्व ढूंढना। – dasblinkenlight

+3

@PatrickLorio इससे कोई फर्क नहीं पड़ता। चूंकि वास्तविक पॉइंटर को पास करके मूल्य से पारित किया जाता है, जब आप '- =' आकार को प्रारंभिक रूप से पारित चर को प्रभावित नहीं करते हैं। –

5

मैं करूंगा और साथ ही शैली बी चुना है, लेकिन उसके बाद आप स्पष्ट छोरों से अधिक मानक एल्गोरिदम को प्राथमिकता देनी चाहिए:

#include <numeric> 

double sum(const double* const series, const int size) { 
    return std::accumulate(series, series + size, 0.0); 
} 
0

सी ++ 11 रास्ता सरणी पुनरावृति करने के लिए (यदि आपने अभी योग नहीं करना चाहते उन्हें और उस संचित अपनी जरूरत फिट नहीं करता है) है:

double sum (const double * series, int size) { 
    double sum = 0.0; 
    for_each (series, series + size, [&](double v) { 
     sum += v; 
    }); 
    return sum; 
} 

ध्यान दें कि यदि आप एक वेक्टर या एक सूची के लिए इस्तेमाल किया आप बहुत ज्यादा एक ही कोड प्राप्त चाहते हैं:

double sum (const vector<double>& series) { 
    double sum = 0.0; 
    for_each (begin(series), end(series), [&](double v) { 
     sum += v; 
    }); 
    return sum; 
} 
संबंधित मुद्दे