pairのsecondだけをソートがしたいです。
ですがsortの第三引数をどう書けばいいか分かりません。
現在動かすと、最新タイムに全て上書きされてしまい。
1位 名前 30.0
2位 名前 30.0
...と全部名前もタイムも上書きされてしまいます。
またタイムは小数点が切り捨てられ?30.5秒なのに30.0になってしまいます。
hファイル
#pragma once
#include <windows.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <locale>
#include <algorithm>
#include <functional>
#include <winnls.h>
#include"timer.h"
#include"debugmsg.h"
using namespace std;
class Ranking_Name
{
private:
vector<string>data;
typedef pair<string,double> rank_pair;
vector<rank_pair>m_ranking;
struct sort_less {
bool operator()(const std::pair<string, double> &left, const std::pair<string,double> &right) {
return left.second < right.second;
}
};
public:
Ranking_Name();
~Ranking_Name();
bool Reading(); //ランキング読み込み
TCHAR name[30];
void Sort_Asc(); //Rankingを昇順にソート
void AddRanking(HDC); //ランキング登録
int NameInput(HWND hWnd1);
};
#include "Ranking_Name.h"
Ranking_Name::Ranking_Name()
{
}
Ranking_Name::~Ranking_Name()
{
}
bool Ranking_Name::Reading()
{
int num = 0;
int i = 0;
string str;
ifstream ifs("ranking.txt");
if (ifs.fail()) { //ランキングファイルが無かったら
for (i = 0; i < 5; i++){
m_ranking.push_back(make_pair("あいうえお", 999.0-i));
}
}
while (getline(ifs, str)) //ランキングファイルがある場合
{
string tmp;
istringstream stream(str);
num += 1;
while (getline(stream, tmp, ','))
{
data.push_back(tmp); //カンマだったらtmpに一時的にデータを入れる
}
m_ranking.resize(num);
m_ranking[i].first = data[0];
m_ranking[i].second = atoi(data[1].c_str());
++i;
data.clear();
}
ifs.close();
return true;
}
void Ranking_Name::Sort_Asc()
{
sort(m_ranking.begin(), m_ranking.end(),sort_less()); //昇順ソート
}
void Ranking_Name::AddRanking(HDC hdc){
int i = 0;
char str[30]; //変換用
TCHAR buf[30]; //変換用
char cstr[30];
ofstream ofs("ranking.txt");
WideCharToMultiByte(CP_ACP, 0, name, -1, cstr, sizeof(cstr), NULL, NULL); //TCHAR からCHAR
m_ranking.push_back(make_pair(cstr, S_time)); //ランキング最後に入れる
Sort_Asc(); //昇順ソート
for (i = 0; i < 5; i++){
ofs << m_ranking[i].first << "," << m_ranking[i].second << "," << endl; //テキストファイルに書き込み
strcpy(str, m_ranking[i].first.c_str()); //stringからcharに変換(コピー)
MultiByteToWideChar(CP_OEMCP, MB_PRECOMPOSED, str, strlen(str), buf, (sizeof buf) / 2); //charからTCHAR
DebugStringColor("%d位", i + 1, hdc, 300, 65 * (4.5 + i), 27, 0, 0, 0); //描画
DebugStringColor("%.1lf秒", m_ranking[i].second, hdc, 600, 65 * (4.5 + i), 27, 0, 0, 0); //描画
DebugStringColor("名前 %s", buf, hdc, 400, 65 * (4.5 + i), 27, 0, 0, 0); //描画
}
m_ranking.pop_back();
m_ranking.resize(5);
}
int Ranking_Name:: NameInput(HWND hWnd1)
{
SYSTEMTIME st;
int age;
TCHAR str[256];
TCHAR *str_org = TEXT("%s");
MessageBox(hWnd1, name, TEXT("名前"), MB_OK);
return 0;
}