アプリケーション開発ポータルサイト
ServerNote.NET
カテゴリー【C/C++
【C++】クラスポインタ配列内で最小の値を持つメンバ変数を検索しそのインデックスを求める
POSTED BY
2021-07-12

【C++】クラスポインタ配列内で特定の値を持つメンバ変数を検索しそのインデックスを求める

の続きで、オリジナルクラスの配列で特定の値を持つ要素を検索しインデックスを求めるまでは同じだが、さらに、最も小さい要素を持つクラスを検索しインデックスを求めるには、std::min_elementをラムダ式で実装しオリジナルの比較関数を記述することで実現する。

以下サンプル

C/C++std_find_if_distance_min.cppGitHub Source
#include <iostream>
#include <vector>
#include <memory>
#include <string>
#include <algorithm>

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

int main(int argc, char **argv) {

  //Testクラスポインタ配列定義
  std::vector<std::shared_ptr<Test>> tests = std::vector<std::shared_ptr<Test>>();

  //Testクラス3つ作成&代入
  tests.push_back(std::make_shared<Test>(std::string("てすと1"), 50));
  tests.push_back(std::make_shared<Test>(std::string("てすと2"), 20));
  tests.push_back(std::make_shared<Test>(std::string("てすと3"), 70));

  //numberが70の最初の要素を検索する(イテレータを返却)
  auto itr = std::find_if(tests.begin(), tests.end(), [&](auto &c) {
    return c->number == 70; //てすと3クラスが返るはず
  });

  int i;

  //見つかった場合
  if(itr != tests.end()) {
    //その配列インデックスを取得
    i = std::distance(tests.begin(), itr);

    std::cout << "number==70 class is " << (*itr)->string << ", and index=" << i << std::endl;
  }

  //numberが最も小さい要素を検索する(イテレータを返却)
  itr = std::min_element(tests.begin(), tests.end(), [&](auto &c1, auto &c2) {
    return c1->number <= c2->number;
  });

  //見つかった場合
  if(itr != tests.end()) {
    //その配列インデックスを取得
    i = std::distance(tests.begin(), itr);

    std::cout << "min number class is " << (*itr)->string << ", number=" << (*itr)->number << ", and index=" << i << std::endl;
  }

  return 0;
}

コンパイル、実行結果

g++ std_find_if_distance_min.cpp

./a.out

number==70 class is てすと3, and index=2
min number class is てすと2, number=20, and index=1

ラムダ式比較関数に比較用クラスが2つ渡されるので、それぞれのnumber要素同士を比較し小さければ真を返し、結果返却値itrにはnumber最小のクラスイテレータが返る。

なお、最大を求めるにはstd::max_elementに変更して、比較関数を

return c1->number >= c2->number;

などと、大きいほうを返すよう変更すればよい。

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

☆お仲間ブログ1↓
匠のコーヒーブレイク
☆お仲間ブログ2↓
一人社長の不動産業務日誌
【キーワード検索】