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)を空にして作り直さなきゃいけないんだよね.(だよね?


まぁそれは別にいいか.

最初にデータを殆どつっこんで,後は使うだけっていうイメージだから.