[過去ログ] C++相談室 part165 (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
75
(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ 9f3e-pD6R) [sage] 2023/12/11(月) 15:45:20.57 ID:wAhsIAfi0(1/2) AAS
>>72
72(2): デフォルトの名無しさん (ワッチョイ 9f1f-oseA) [sage] 2023/12/11(月) 15:17:51.77 ID:7vxydTfj0(1/2) AAS
ある構造体Aがあります
Aの比較関数が複数ありますcompA0,compA1,compA2,...
比較関数の関数ポインタがありますcompA
compA = &compA2;

別の構造体Bがあります
BはAを内包しています
struct B{ A a; ... };
この構造体Bを、Aの比較関数ポインタcompAで比較してソートするにはどう記述すればよいですか?
std::vector<B> bs;
bs.push_back(...);...
std::sort(bs.begin(),bs.end(),?);

できればラムダ式を使わずにできるとありがたいです
もし C++20 を使えるなら (std::sort と違って) std::ranges::sort では比較関数とは別に
比較すべき要素を取り出す操作をプロジェクションとして与えることが出来るから
これ一発でいけてだいぶん楽できる。

std::ranges::sort(bs, compA, &B::a);
79
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 9f3e-pD6R) [sage] 2023/12/11(月) 17:25:04.51 ID:wAhsIAfi0(2/2) AAS
その場で合成するのはさすがに見通しが悪すぎるので、
C++11 頃の C++ を仮定して私がやるならまずアダプタを作ると思う。
ちょっと雑ですまんがとりあえずこんな感じ。

class compB_adaptor {
private:
using comparator = std::function<bool(const A&, const A&)>;
comparator compA;

public:
compB_adaptor(comparator comp) : compA(comp) {}
bool operator()(const B& x, const B& y) {
return compA(x.a, y.a);
}
};

使うときには間にひとつ挟むだけで済む。

std::sort(bs.begin(), bs.end(), compB_adaptor(compA));
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.037s