2012-10-26 18 views
5

は、どのように私はaccumulate機能を使用して(15)と、それの前半の合計を計算することができます計算STDを使用して、ベクターの一部の合計は::

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

このベクトルを持つ蓄積しますか?

forループをイテレータ(数値インデックスではない)のみで使用することはできますか?

答えて

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だから今、あなたはどちらかのstdに::蓄積し、それらを使用することができますご希望の範囲を指定イテレータまたはループのためのマニュアルを作成することができます


あなたが実際にmutability(一般的な 'const'の良さ)を必要としない限り、' 'const_iterator'を使って' 'end_boundator''を使用してループを進化させます。 'for(std :: vector :: const_iterator it = v.begin()、end = v.begin()+ v.size()/ 2; it!= end; ++ i)'になります。 C++ 11では( 'auto'と' cbegin'を使って)少し短くすることができます。 –

+0

@ Rob i私はあまりにも浮動小数点数を扱うのに慣れています:) – 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

は、あなただけの、その範囲をカバーするイテレータを取得する必要がちょうど前半で動作するように:

また、ループを書くことができます。通常、人は全体のコンテナで動作するようにしたいので、彼らは開始と終了の機能を使用していますが、それが唯一の方法ではありません。

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

進歩は入力イテレータ以上のため、もの一つではありません入力イテレータのために働きます他のタイプでは、先行されたアイテムはもはやアクセスできなくなります。

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) { 
    ... 
} 
関連する問題