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) {
...
}
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'). –
@ Robᵩ Perché sono un po 'troppo abituato a lavorare con i float :) – alestanis