内のすべての要素の合計を求める良い方法は何ですかstd::vector
?
いくつかの要素を含むベクトルがあるとしますstd::vector<int> vector
。ここで、すべての要素の合計を求めます。これを行うにはどのような方法がありますか?
ベストアンサー1
実は方法はいくつかあります。
int sum_of_elems = 0;
C++03
古典的な for ループ:
for(std::vector<int>::iterator it = vector.begin(); it != vector.end(); ++it) sum_of_elems += *it;
標準アルゴリズムの使用:
#include <numeric> sum_of_elems = std::accumulate(vector.begin(), vector.end(), 0);
重要な注意:最後の引数の型は、初期値だけでなく、結果の型にも使用されます。そこに int を置くと、ベクターに float があっても int が累積されます。浮動小数点数を合計する場合は、または(
0
に変更します。0.0
0.0f
nneonneoに感謝)。以下の C++11 ソリューションも参照してください。
C++11以上
b. 将来変更があった場合でもベクタータイプを自動的に追跡します。
#include <numeric> sum_of_elems = std::accumulate(vector.begin(), vector.end(), decltype(vector)::value_type(0));
使用方法
std::for_each
:std::for_each(vector.begin(), vector.end(), [&] (int n) { sum_of_elems += n; });
範囲ベースのforループを使用する(ロジャー・ペイトに感謝):
for (auto& n : vector) sum_of_elems += n;
C++17以上
whichを使用すると
std::reduce
、結果の型も処理されます。たとえば、 がある場合std::vector<int>
、int
結果として が返されます。 がある場合std::vector<float>
、 が返されますfloat
。 がある場合std::vector<std::string>
、(すべての文字列が連結された) が返されますstd::string
。興味深いと思いませんか?#include <numeric> auto result = std::reduce(v.begin(), v.end());
があるこの関数の他のオーバーロード大規模なコレクションがあり、結果をすぐに取得したい場合には、並列実行することもできます。