[解決済み] ペアの2番目の要素に基づいてペアのベクトルをソートするにはどうすればよいですか?
2022-02-06 11:14:31
質問内容
ペアのベクトルがある場合。
std::vector<std::pair<int, int> > vec;
のリストを簡単にソートする方法はありますか? 増加中 の順序を、ペアの2番目の要素に基づいて決定する必要があります。
ちょっとした関数オブジェクトを書けばいいのは分かっているのですが、 既存の
STL
と
std::less
を直接行うのですか?
EDIT: ソートするための第3引数に渡す関数やクラスを別に書けばいいということは理解しました。 問題は、それを標準的なものから構築できるかどうかです。 本当はこんな感じのものがいいんだけど。
std::sort(vec.begin(), vec.end(), std::something_magic<int, int, std::less>());
解決方法は?
EDIT
: c++14 を使っている場合、最適な解決策は、ラムダが型のパラメータを持つことができるようになったおかげで、非常に簡単に書くことができます。
auto
.
これは、私の現在のお気に入りの解決策です。
std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
return left.second < right.second;
});
オリジナル回答 :
カスタムコンパレータを使用すればよいのです。
std::sort
)
struct sort_pred {
bool operator()(const std::pair<int,int> &left, const std::pair<int,int> &right) {
return left.second < right.second;
}
};
std::sort(v.begin(), v.end(), sort_pred());
C++11コンパイラを使用している場合は、ラムダを使用して同じように書くことができます。
std::sort(v.begin(), v.end(), [](const std::pair<int,int> &left, const std::pair<int,int> &right) {
return left.second < right.second;
});
EDIT : 質問に対するあなたの編集に応えて、ここにいくつかの考えを述べます. もし 本当に クリエイティブに、そしてこのコンセプトをたくさん再利用できるようにしたいのであれば、テンプレートを作ればいいのです。
template <class T1, class T2, class Pred = std::less<T2> >
struct sort_pair_second {
bool operator()(const std::pair<T1,T2>&left, const std::pair<T1,T2>&right) {
Pred p;
return p(left.second, right.second);
}
};
であれば、これも可能です。
std::sort(v.begin(), v.end(), sort_pair_second<int, int>());
あるいは
std::sort(v.begin(), v.end(), sort_pair_second<int, int, std::greater<int> >());
正直なところ、これはちょっとやりすぎで、3行の関数を書いておしまいです :-P
関連
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】 ベクターの重複を消去してソートする最も効率的な方法は何ですか?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
-
[解決済み] std::vectorをハードコードされた要素で初期化する最も簡単な方法は何ですか?
-
[解決済み] std::vector<> からインデックスで要素を消すにはどうしたらいいですか?
-
[解決済み】C++ STL Vectors: インデックスからイテレータを取得する?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる