C++ で配列の合計を計算する
この記事では、C++ で配列要素の合計を計算する方法のいくつかの方法について説明します。
C++ で配列要素の和を計算するには、std::accumulate
関数を使用する
std::accumulate
は、ヘッダーファイル <numeric>
の下の STL ライブラリに含まれている数値関数の一部です。std::accumulate
は、指定された範囲内の要素で機能する汎用関数であり、対応するイテレータによって表される最初の 2つの引数によって指定されます。3 番目の引数は、合計の初期値を渡すために使用されます。これは、オブジェクトのリテラル値にすることができます。この場合、std::vector
コンテナに格納されている整数の動的配列を示します。std::accumulate
は、オプションで、バイナリ関数オブジェクトタイプの 4 番目の引数を取り、加算演算を置き換えることができることに注意してください。次のサンプルコードの std::accumulate
への 2 番目の呼び出しは、そのようなシナリオを示していますが、乗算が二項演算として使用されるという唯一の違いがあります。
#include <iostream>
#include <numeric>
#include <vector>
using std::accumulate;
using std::cin;
using std::cout;
using std::endl;
using std::vector;
template <typename T>
void printVector(vector<T> &vec) {
for (const auto &item : vec) {
cout << item << ", ";
}
cout << endl;
}
int main() {
vector<int> arr1 = {1, 12, 13, 10, 11};
printVector(arr1);
int arr1_sum = accumulate(arr1.begin(), arr1.end(), 0);
cout << "sum of arr1 = " << arr1_sum << endl;
int arr1_product =
accumulate(arr1.begin(), arr1.end(), 1, std::multiplies<>());
cout << "product of arr1 = " << arr1_product << endl;
return EXIT_SUCCESS;
}
出力:
1, 12, 13, 10, 11,
sum of arr1 = 47
product of arr1 = 17160
C++ でサブアレイの部分和を計算するには、std::partial_sum
関数を使用する
同じヘッダーファイルによって提供されるもう 1つの便利な数値関数は、std::partial_sum
です。これは、指定された範囲のサブ範囲を合計します。この関数は、3 番目の引数が計算された数値が格納される範囲の開始イテレータである必要があることを除いて、前のインターフェイスと同様のインターフェイスを提供します。この場合、既存のベクトル要素を合計結果で上書きします。カスタム二項演算を std::partial_sum
で指定して、デフォルトのオプションである加算を変更することもできることに注意してください。
#include <iostream>
#include <numeric>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
template <typename T>
void printVector(vector<T> &vec) {
for (const auto &item : vec) {
cout << item << ", ";
}
cout << endl;
}
int main() {
vector<int> arr1 = {1, 12, 13, 10, 11};
printVector(arr1);
std::partial_sum(arr1.begin(), arr1.end(), arr1.begin());
printVector(arr1);
std::partial_sum(arr1.begin(), arr1.end(), arr1.begin(), std::multiplies());
printVector(arr1);
return EXIT_SUCCESS;
}
出力:
1, 13, 26, 36, 47,
1, 13, 338, 12168, 571896,
あるいは、これらの関数を使用して、指定された範囲内の要素間でビット単位の演算を実行することもできます。たとえば、次のコードスニペットは vector
要素を XOR し、結果値を同じ範囲に格納します。
#include <iostream>
#include <numeric>
#include <vector>
using std::cin;
using std::cout;
using std::endl;
using std::vector;
template <typename T>
void printVector(vector<T> &vec) {
for (const auto &item : vec) {
cout << item << ", ";
}
cout << endl;
}
int main() {
vector<int> arr1 = {1, 12, 13, 10, 11};
printVector(arr1);
std::partial_sum(arr1.begin(), arr1.end(), arr1.begin(), std::bit_xor());
printVector(arr1);
return EXIT_SUCCESS;
}
出力:
1, 13, 0, 10, 1,