2012-10-26 17 views

cevap

6

yapabilirsiniz

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

v vektör ise.

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

: 1 Yani şimdi ya std :: birikir kullanabilirsiniz istediğiniz aralığı belirtin yineleyicinızı veya döngü için bir el kitabı oluşturabilirsiniz


'const_iterator' kullanarak gerçekten mutabiliteye (sadece genel 'const' goodness) ihtiyaç duymadıkça ve 2. '' zamanın sınırlarını aşan bir zamanda hesaplamaktan kaçınmak için, döngü sırasında evrimleşmez. Bu, aşağıdakileri sağlar: (std :: vektör :: const_iterator it = v.begin(), end = v.begin() + v.size()/2; it! = Son; ++ i) '. C++ 11'de kısaltılabilir ('auto' ve' cbegin' kullanarak). –

+0

@ Robᵩ Çünkü ben şamandıralarla çalışmak için biraz fazla kullanıyorum :) – alestanis

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

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

3

sadece o aralığını kapsayan yineleyicinızı almak zorunda sadece ilk yarısında çalışmak için:

Üstelik döngü yazabilir. Genellikle insanlar bütün bir kap ile çalışmak istiyoruz ve bu yüzden uç işlevlerini başlayacak ve kullanımı, ama bu sadece yol değil: Giriş yineleyiciler ya da daha iyi çalışır

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); 

avans ama giriş Yineleyicilerin için de biri değil hangi Diğerleri, gelişmiş iletilen öğelere artık erişilemez.

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

Ve bunlar, farklı yineleyici türlerinde gerçekleştirebileceğiniz kullanılabilir işlemlerden yalnızca birkaçı. Ben öneriyoruz En iyi yöntem olarak

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) { 
    ... 
}