は、どのように私はaccumulate機能を使用して(15)と、それの前半の合計を計算することができます計算STDを使用して、ベクターの一部の合計は::
vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
このベクトルを持つ蓄積しますか?
forループをイテレータ(数値インデックスではない)のみで使用することはできますか?
は、どのように私はaccumulate機能を使用して(15)と、それの前半の合計を計算することができます計算STDを使用して、ベクターの一部の合計は::
vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
このベクトルを持つ蓄積しますか?
forループをイテレータ(数値インデックスではない)のみで使用することはできますか?
することはでき
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;
}
accumulate<int>(v.cbegin(), v.cbegin() + v.size()/2, 0);
int sum = std :: accumulate(v.begin()、v.begin()+ v.size()/ 2、0);
は、あなただけの、その範囲をカバーするイテレータを取得する必要がちょうど前半で動作するように:
また、ループを書くことができます。通常、人は全体のコンテナで動作するようにしたいので、彼らは開始と終了の機能を使用していますが、それが唯一の方法ではありません。
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) {
...
}
: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'を使って)少し短くすることができます。 –
@ Rob i私はあまりにも浮動小数点数を扱うのに慣れています:) – alestanis