質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2029閲覧

C++でtupleを型としたvectorのソートを、tupleの任意の要素を基準にしたい

Removed_Past

総合スコア14

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/08/03 11:55

前提・実現したいこと

C++において、
tupleを型としたvectorをsortするときに、
tupleの任意の要素を基準にsortをしたいです。

該当のソースコード

c++

1tuple<short, int, vector<short>> bdcheck(int n, short t, int b, int w){ 2 /* 略 */ 3 int s = cntsco(t, (t == 1) ? b : w); 4 5 tuple<short, int, vector<short>> back = make_tuple(n, s, vbd); 6 return back; 7} 8 9int osero(int b, int w){ 10 short bs = 2, ws = 2; 11 short turn = 1; 12 bool dp = false; 13 short winner; 14 /* 変数説明 15 bs, ws … 取得枚数 16 turn … 手番 17 dp … 二重パス判定 18 winner … 勝者 19 */ 20 21 init(); 22 23 while(1){ 24 if(bs + ws == 64) break; 25 vector<tuple<short, int, vector<short>>> can(32); // 置けるマスリスト 26 short pnt = 0; 27 rep(n, 64){ 28 try{ 29 tuple<short, int, vector<short>> x; 30 x = bdcheck(n, turn, b, w); 31 can[pnt] = x; 32 pnt++; 33 } 34 catch(int num){ 35 continue; 36 } 37 } 38 can.resize(pnt); 39 /* この後、tuple内のintを基準にソートをしたい */ 40 } 41}

試したこと

色々な解説を見てみましたが、どうやればいいかが分かりませんでした…

補足情報

コンパイラはMinGW6.3.0を使用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

typedef tuple<short, int, vector<short>> item; sort(can.begin(), can.end(), [](const item& x, const item& y) { return get<1>(x) < get<1>(y); });

で よくね?

投稿2018/08/03 12:26

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こんちは。

ソートする部分だけ示します。コンペア関数の中身はソートの仕様(昇順 or 降順)により適切に選択下さい。

C++

1#include <tuple> 2#include <vector> 3#include <algorithm> 4 5using namespace std; 6 7typedef tuple<short, int, vector<short>> Type; 8 9int main() 10{ 11 vector<Type> can(32); 12 sort(can.begin(), can.end(), 13 [](Type const& iLhs, Type const& iRhs) 14 { 15 return get<1>(iLhs) > get<1>(iRhs); 16 } 17 ); 18 return 0; 19}

ところで、std::tupleは型の定義が不要なstructですから、型推論を積極的に使わない使い方ならstructの方が可読性は高いです。

上述のTypeをstructで宣言しても同じことが可能な筈です。(tupleではできませんが、メンバ名を適切に付けると可読性が上がりますよ。)

C++

1struct Type 2{ 3 short mData0; 4 int mData1; 5 vector<short> mData2; 6 Type() : mData0(0), mData1(0) { } 7};

投稿2018/08/03 12:34

編集2018/08/03 18:46
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Removed_Past

2018/08/06 12:38

細やかな解説ありがとうございます! 無事に解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問