このベクトルを持つ
vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
累積関数を使用して前半(15)の合計を計算するにはどうすればよいですか?
(数値インデックスではなく) イテレータのみを使用して for ループを使用してこれを行うことはできますか?
このベクトルを持つ
vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
累積関数を使用して前半(15)の合計を計算するにはどうすればよいですか?
(数値インデックスではなく) イテレータのみを使用して for ループを使用してこれを行うことはできますか?
あなたはできる
accumulate(v.begin(), v.begin()+int(v.size()/2), 0)
ifv
はあなたのベクトルです。
ループを書くこともできます:
int sum = 0;
for (vector<int>::iterator it = v.begin(); it != v.begin+int(v.size()/2); ++it) {
sum += *it;
}
前半だけを扱うには、その範囲だけをカバーする反復子を取得する必要があります。通常、人々はコンテナ全体を操作したいので、begin 関数と end 関数を使用しますが、それが唯一の方法ではありません。
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 は入力イテレータ以上で機能しますが、他のタイプの 1 つではない入力イテレータの場合、advanced で渡された項目にはアクセスできなくなります。
auto middle = std::next(begin, v.size()/2); // C++11. works for forward iterators
これらは、さまざまなタイプの反復子で実行できる使用可能な操作のほんの一部です。
目的の範囲を指定するイテレータを作成できるようになったので、それらを std::accumulate または手動の for ループで使用できます。
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) {
...
}
accumulate<int>(v.cbegin(), v.cbegin() + v.size()/2, 0);
int sum = std::accumulate(v.begin(), v.begin() + v.size() / 2, 0);