回答編集履歴

2

typo

2016/02/03 10:30

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -82,7 +82,7 @@
82
82
 
83
83
  【別解】
84
84
 
85
- catsforepawさんも同じ意味で理解されていようなの、間違ってないようでちょっと安心。
85
+ catsforepawさんも同じ意味で理解されていようなの、間違ってないようでちょっと安心。
86
86
 
87
87
  で、[メンバ変数へのポインタ](http://homepage2.nifty.com/well/Pointer.html#POINTER_TO_CLASS_MEMBER)を使ってより使いやすく書けました。
88
88
 
@@ -136,4 +136,4 @@
136
136
 
137
137
  rank()関数の定義側は複雑ですが、使い方は随分すっきりできましたし、DataIn型にも依存してません。
138
138
 
139
- m_mapAttackRank等のoperator[]に使える型のidメンバを持っていればOKです。この型も型推論に任せることができたので、uint64_tでなくても使えます。
139
+ m_mapAttackRank等のoperator[]に使える型のidメンバを持っていればOKです。この型も型推論に任せることができたので、uint64_tでなくても使えます。(unordered_map<>の指定で決まります。)

1

追加

2016/02/03 10:30

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -75,3 +75,65 @@
75
75
  });
76
76
 
77
77
  ```
78
+
79
+
80
+
81
+ ---
82
+
83
+ 【別解】
84
+
85
+ catsforepawさんも同じ意味で理解されていようなのて、間違ってないようでちょっと安心。
86
+
87
+ で、[メンバ変数へのポインタ](http://homepage2.nifty.com/well/Pointer.html#POINTER_TO_CLASS_MEMBER)を使ってより使いやすく書けました。
88
+
89
+
90
+
91
+ ```C++
92
+
93
+ template<typename tData, typename tValueType, typename tMapKey>
94
+
95
+ void rank(std::vector<const tData*>& iData,
96
+
97
+ std::unordered_map<tMapKey, int>& oRank,
98
+
99
+ tValueType tData::*iValue)
100
+
101
+ {
102
+
103
+ std::sort(iData.begin(), iData.end(),
104
+
105
+ [&iValue] (const tData* l, const tData* r)
106
+
107
+ {
108
+
109
+ return (l->*iValue) > (r->*iValue);
110
+
111
+ });
112
+
113
+ for (int i = 0 , rank = 5 ; 0 < rank ; i++ , rank--)
114
+
115
+ {
116
+
117
+ // 数値が高い順に5~1のランクをつける。
118
+
119
+ oRank[iData.at(i)->id] = rank;
120
+
121
+ }
122
+
123
+ }
124
+
125
+ ```
126
+
127
+ 以下のようにして呼び出します。
128
+
129
+ ```C++
130
+
131
+ rank(ref, m_mapAttackRank, &DataIn::attack);
132
+
133
+ rank(ref, m_mapDefenceRank, &DataIn::defence);
134
+
135
+ ```
136
+
137
+ rank()関数の定義側は複雑ですが、使い方は随分すっきりできましたし、DataIn型にも依存してません。
138
+
139
+ m_mapAttackRank等のoperator[]に使える型のidメンバを持っていればOKです。この型も型推論に任せることができたので、uint64_tでなくても使えます。