2012-10-26 17 views

Odpowiedz

6

Można

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

jeśli v to wektor.

Można również napisać pętlę:

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

Jako najlepszych praktyk Polecam: 1 używając 'const_iterator', chyba że naprawdę potrzebujesz mutability (tylko ogólna" const "dobroć) i 2. obliczasz' end' związany przed czasem, aby było jasne, że nie ewoluuje podczas pętli. Daje to: 'for (std :: vector :: const_iterator it = v.begin(), end = v.begin() + v.size()/2; it! = End; ++ i)'. Można go skrócić nieco w C++ 11 (używając 'auto' i' cbegin'). –

+0

@ Robᵩ Bo jestem zbytnio przyzwyczajony do pracy z pływającymi :) – 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

Aby zająć się tylko w pierwszej połowie trzeba dostać iteratorów, które obejmują tylko ten zakres. Zazwyczaj ludzie chcą pracować z całego pojemnika i tak używają rozpocząć i funkcje końcowych, ale nie jest to jedyny sposób:

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

advance pracuje dla iteratorów wejściowych lub lepsze, ale dla iteratorów wejściowych, które nie są również jednym z inne typy elementów, które zostały przekazane jako zaawansowane, nie będą już dostępne.

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

A to tylko niektóre z dostępnych operacji, które można wykonać na różnych typach iteratorów.


Więc teraz, że można tworzyć iteratory które określają pożądany zakres można ich używać zarówno w std :: gromadzić lub podręcznik dla pętli:

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) { 
    ... 
} 
Powiązane problemy