2012-10-26 12 views

risposta

6

Puoi

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

se v è il vostro vettore.

È possibile anche scrivere un ciclo:

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

Come procedura mi sento di raccomandare: 1 usando 'const_iterator' a meno che non si abbia realmente bisogno della mutabilità (solo in generale' const' bontà) e 2. calcolando il limite 'end' prima del tempo, per rendere chiaro che non si evolve durante il ciclo. Questo dà: 'for (std :: vector :: const_iterator it = v.begin(), end = v.begin() + v.size()/2; it! = End; ++ i)'. Può essere abbreviato un po 'in C++ 11 (usando 'auto' e' cbegin'). –

+0

@ Robᵩ Perché sono un po 'troppo abituato a lavorare con i float :) – alestanis

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

int sum = std :: si accumulano (v.begin(), v.begin() + V.SIZE()/2, 0);

3

Per lavorare con solo il primo tempo si deve arrivare iteratori che coprono solo tale intervallo. Di solito la gente vuole lavorare con un intero contenitore e così usano iniziare e funzioni di fine, ma non è l'unico modo:

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

anticipo lavora per iteratori di ingresso o meglio, ma per iteratori di input che non sono anche uno dei l'altro tipo non sarà più accessibile agli elementi avanzati.

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

E queste sono solo alcune delle operazioni disponibili che è possibile eseguire sui diversi tipi di iteratori.


Quindi, ora che è possibile creare iteratori che specificano la vostra gamma desiderata è possibile utilizzare sia in std :: accumulare o un manuale per ciclo:

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