カテゴリー【C/C++】
【C++】クラスポインタ配列内で最小の値を持つメンバ変数を検索しそのインデックスを求める
POSTED BY
2023-07-11
2023-07-11
【C++】クラスポインタ配列内で特定の値を持つメンバ変数を検索しそのインデックスを求める
の続きで、オリジナルクラスの配列で特定の値を持つ要素を検索しインデックスを求めるまでは同じだが、さらに、最も小さい要素を持つクラスを検索しインデックスを求めるには、std::min_elementをラムダ式で実装しオリジナルの比較関数を記述することで実現する。
以下サンプル
C/C++ | std_find_if_distance_min.cpp | GitHub 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;
などと、大きいほうを返すよう変更すればよい。
Android
iPhone/iPad
Flutter
MacOS
Windows
Debian
Ubuntu
CentOS
FreeBSD
RaspberryPI
HTML/CSS
C/C++
PHP
Java
JavaScript
Node.js
Swift
Python
MatLab
Amazon/AWS
CORESERVER
Google
仮想通貨
LINE
OpenAI/ChatGPT
IBM Watson
Microsoft Azure
Xcode
VMware
MySQL
PostgreSQL
Redis
Groonga
Git/GitHub
Apache
nginx
Postfix
SendGrid
Hackintosh
Hardware
Fate/Grand Order
ウマ娘
将棋
ドラレコ
※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!ご連絡は以下アドレスまでお願いします★
【キーワード検索】
【最近の記事】【全部の記事】
Intel Macbook2020にBootCampで入れたWindows11 Pro 23H2のBluetoothを復活させるWindowsのデスクトップ画面をそのまま配信するための下準備
WindowsでGPUの状態を確認するには(ASUS系監視ソフトの自動起動を停止する)
CORESERVER v1プランからさくらインターネットスタンダートプランへ引っ越しメモ
さくらインターネットでPython MecabをCGIから使う
さくらインターネットのPHPでAnalytics-G4 APIを使う
インクルードパスの調べ方
【Git】特定ファイルを除外する.gitignore
【Ubuntu/Debian】NVIDIA関係のドライバを自動アップデートさせない
【Python】Spacyを使用して文章から出発地と目的地を抜き出す
【人気の記事】【全部の記事】
進研ゼミチャレンジタッチをAndroid端末化する【Windows10】リモートデスクトップ間のコピー&ペーストができなくなった場合の対処法
Windows11+WSL2でUbuntuを使う【2】ブリッジ接続+固定IPの設定
Windows版Google Driveが使用中と言われアンインストールできない場合
VirtualBoxの仮想マシンをWindows起動時に自動起動し終了時に自動サスペンドする
【Apache】サーバーに同時接続可能なクライアント数を調整する
【C/C++】小数点以下の切り捨て・切り上げ・四捨五入
Googleファミリーリンクで子供の端末の現在地がエラーで取得できない場合
【Linux】iconv/libiconvをソースコードからインストール
Ubuntu Server 21.10でイーサリアムブロックチェーン【その5】
【カテゴリーリンク】
Android
iPhone/iPad
Flutter
MacOS
Windows
Debian
Ubuntu
CentOS
FreeBSD
RaspberryPI
HTML/CSS
C/C++
PHP
Java
JavaScript
Node.js
Swift
Python
MatLab
Amazon/AWS
CORESERVER
Google
仮想通貨
LINE
OpenAI/ChatGPT
IBM Watson
Microsoft Azure
Xcode
VMware
MySQL
PostgreSQL
Redis
Groonga
Git/GitHub
Apache
nginx
Postfix
SendGrid
Hackintosh
Hardware
Fate/Grand Order
ウマ娘
将棋
ドラレコ