mapをsort
mapのデータをmapのindexとは別の値でソートする.
何か基本的すぎて別に書く必要はないかもしれないけど,覚書.
AFClib.GUIで使うの.
カテゴリには入れてないけど.
後暇つぶし(MHF内の時間が過ぎるのを待っているww
ぁ,サンプルは生徒の点数を保存して,
・学籍番号でアクセスできる
・点数順でソートしてアクセスできる
を満たすようにしました.
#include <iostream> #include <map> #include <vector> #include <algorithm> // テスト用のデータ構造体 struct student { int no; // 学籍番号.mapのindexはこれ. int score; // 何かの点数.これでsortする. student(): no(0), score(0){} student(int n, int s): no(n), score(s){} }; typedef std::map<int, student>::const_iterator map_stu_citer_t; typedef std::vector<map_stu_citer_t>::const_iterator vec_stu_citer_t; // std::sortで使うstudent::scoreでsort bool compare(const map_stu_citer_t& lhs, const map_stu_citer_t& rhs){ return (lhs->second.score < rhs->second.score); } int main(){ std::map<int, student> students; // 複数形ね // テストデータ students[0] = student(0, 50); // students[学籍番号] = student(学籍番号, 点数); students[1] = student(1, 30); // students[学籍番号]でデータを見れるようにするため students[2] = student(2, 70); students[3] = student(3, 60); std::vector<map_stu_citer_t> sorted; // sortするイテレータを入れる箱 // イテレータを入れる for(map_stu_citer_t it = students.begin(); it != students.end(); ++it) sorted.push_back(it); // これこんな風にできないかな // std::copy(students.begin(), students.end(), std::back_inserter(sorted)); // std::copyの実装を見る限りstd::copyでは無理そうだったけど std::sort(sorted.begin(), sorted.end(), compare); // sortするの // 結果表示 for(vec_stu_citer_t it = sorted.begin(), int r = 1; it != sorted.end(); ++it, ++r){ std::cout << "rank:" << r << "; "; std::cout << "no:" << (*it)->second.no << "; "; std::cout << "score:" << (*it)->second.score << std::endl; } return 0; }
出力結果
rank:1; no:1; score:30
rank:2; no:0; score:50
rank:3; no:3; score:60
rank:4; no:2; score:70
…ぁ,逆じゃんw
スコア低い方がrankが良いw
まぁ「何かの点数」だし,大きい方がいいとは限らないよねーw
落とした単位数とか(ぇ.
まぁでもこれ,students(map)にデータが追加されたらもう一回sorted(vector)を空にして作り直さなきゃいけないんだよね.(だよね?
まぁそれは別にいいか.
最初にデータを殆どつっこんで,後は使うだけっていうイメージだから.