アプリケーション開発ポータルサイト
ServerNote.NET
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;

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

年間4億本を製造・販売する飲料メーカー直営通販サイト【LIFEDRINKオンラインストア】
●強炭酸水「ZAO SODA」● 蔵王連峰山麓の磨かれた水を使用した、大人気の無糖炭酸水です。 国産のおいしい...READ MORE
【最大35,000円キャッシュバック!】コミュファ光キャンペーン
株式会社NNコミュニケーションズが運営するコミュファ光キャンペーンサイトです。【高額キャッシュバック特...READ MORE
【敏感肌でも始められるエイジングケア】ノブL&W トライアルセット
臨床皮膚医学に基づいて考えた 敏感肌のためのエイジングケアシリーズです。 ・乾燥・肌あれ対策   保湿...READ MORE
※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【webmaster/管理人】
自営業プログラマー
ご連絡は以下アドレスまで★

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