2012-10-26 16 views
5

इस सदिश होनेकंप्यूट वेक्टर std :: उपयोग करने के भाग की राशि जमा

vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

मैं कैसे की गणना कर सकता पहली छमाही इसके बारे में (जो 15) की राशि accumulate समारोह का उपयोग कर?

क्या मैं इसे केवल इटरेटर (संख्यात्मक अनुक्रमणिका नहीं) के साथ लूप के लिए कर सकता हूं?

उत्तर

6

आप कर सकते हैं

accumulate(v.begin(), v.begin()+int(v.size()/2), 0) 

अगर v अपने वेक्टर है।

int sum = 0; 
for (vector<int>::iterator it = v.begin(); it != v.begin+int(v.size()/2); ++it) { 
    sum += *it; 
} 
+1

एक सबसे अच्छा अभ्यास मैं सिफारिश करेंगे के रूप में: 1


तो अब है कि आप iterators या पाश के लिए एक मैनुअल आप उन्हें इस्तेमाल कर सकते हैं या तो एसटीडी में :: जमा अपने वांछित सीमा निर्दिष्ट है कि बना सकते हैं

'const_iterator' का उपयोग करके जब तक आपको वास्तव में उत्परिवर्तन की आवश्यकता नहीं होती है (केवल सामान्य' const' goodness) और 2. समय से पहले 'अंत' बाध्य कंप्यूटिंग, इसे स्पष्ट करने के लिए यह लूप के दौरान विकसित नहीं होता है। यह देता है: 'के लिए (std :: वेक्टर :: const_iterator it = v.begin(), end = v.begin() + v.size()/2; it! = End; ++ i) '। इसे सी ++ 11 में थोड़ा सा छोटा किया जा सकता है ('auto' और 'cbegin' का उपयोग करके)। –

+0

@ रोबᵩ क्योंकि मैं फ्लोट के साथ काम करने के लिए बहुत कम उपयोग किया जाता हूं :) – alestanis

1
accumulate<int>(v.cbegin(), v.cbegin() + v.size()/2, 0); 
1

int sum = std :: accumulate (v.begin(), v.begin() + v.size()/2, 0);

3

सिर्फ पहली छमाही आप iterators कि सिर्फ इतना है कि सीमा तक प्राप्त करने के लिए के साथ काम करने के लिए:

तुम भी एक पाश लिख सकते हैं। आम तौर पर लोगों को एक पूरे कंटेनर के साथ काम करना चाहते हैं और इसलिए वे अंत कार्यों शुरू करते हैं और उपयोग करते हैं, लेकिन यह है कि एक ही रास्ता नहीं है:

auto begin = std::begin(v); 
auto middle = std::begin(v) + v.size()/2; // works for random access iterators 

auto middle = begin; 
std::advance(middle, v.size()/2); 

अग्रिम इनपुट iterators या बेहतर के लिए काम करता है, लेकिन इनपुट iterators के लिए जो भी से एक नहीं हैं अन्य प्रकार जो आइटम पास किए गए हैं वे अब उपलब्ध नहीं होंगे।

auto middle = std::next(begin, v.size()/2); // C++11. works for forward iterators 

और ये उपलब्ध कुछ ऑपरेशन हैं जो आप विभिन्न प्रकार के इटरेटर पर कर सकते हैं।

std::accumulate(std::begin(v), std::next(std::begin(v), v.size()/2), 0); 

for (auto begin(std::begin(v)), end(begin+v.size()/2); begin!=end; ++begin) { 
    ... 
}