アプリケーション開発ポータルサイト
ServerNote.NET
ServerNote.NET厳選キャンペーン・クーポンはこちら!
カテゴリー【C/C++
【C++】クラス配列の任意のメンバ変数の総和を求める
POSTED BY
2020-12-16

メンバ変数にintとstringを持つ以下のようなクラスがあるとして、

#include <string>

class Test {
public:
  int number;
  std::string string;
  Test(int n, std::string s) {
    number = n;
    string = s;
  }
};

その配列を以下のように確保したとする。

#include <vector>

std::vector<Test> tests = std::vector<Test>();

tests.push_back(Test(1, std::string("あ")));
tests.push_back(Test(2, std::string("い")));
tests.push_back(Test(3, std::string("う")));
tests.push_back(Test(4, std::string("え")));
tests.push_back(Test(5, std::string("お")));

ここで、メンバ変数numberおよびstringの総和を求めるにはstd::accumulateを使う。

#include <numeric>

int number_all = std::accumulate( tests.begin(), tests.end(), 0,
  []( int n, auto &c ){ return n + c.number; } );

std::string string_all = std::accumulate( tests.begin(), tests.end(), std::string(""),
  []( std::string s, auto &c ){ return s + c.string; } );

第3引数には総和の初期値、第4引数に加算関数をラムダ式に定義する。なお、vectorがクラスでなく単体intやstringの配列なら第4引数(加算関数)の定義は不要であり、自動加算される。

トータルのサンプルソースは以下。

C/C++std_accumulate.cppGitHub Source
#include <iostream>
#include <vector>
#include <string>
#include <numeric>

class Test {
public:
  int number;
  std::string string;
  Test(int n, std::string s) {
    number = n;
    string = s;
  }
};

int main(void) {

  std::vector<Test> tests = std::vector<Test>();

  tests.push_back(Test(1, std::string("あ")));
  tests.push_back(Test(2, std::string("い")));
  tests.push_back(Test(3, std::string("う")));
  tests.push_back(Test(4, std::string("え")));
  tests.push_back(Test(5, std::string("お")));

  int number_all = std::accumulate( tests.begin(), tests.end(), 0,
    []( int n, auto &c ){ return n + c.number; } );

  std::string string_all = std::accumulate( tests.begin(), tests.end(), std::string(""),
    []( std::string s, auto &c ){ return s + c.string; } );

  std::cout << "number_all=" << number_all << ", string_all=" << string_all << std::endl;

  return 0;
}

コンパイル、実行結果

g++ std_accumulate.cpp

./a.out

number_all=15, string_all=あいうえお
※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【webmaster/管理人】
自営業プログラマー
ご連絡は以下アドレスまで★

☆ServerNote.NETショッピング↓
ShoppingNote
☆お仲間ブログ↓
一人社長の不動産業務日誌
【キーワード検索】