我创建了一个小高分系统,保存到文件,然后根据请求读取/加载。
但是,我正在加载到字符串向量中,因此创建了一个字符串构建器来添加它们并按顺序显示。
然而,我已经意识到这是一种不好的做法,并且不确定如何获得我想要的结果,这将是一个数据结构,可以按照得分(降序)的顺序排序相应的名称。
我在理论上要做的是<vector<int, string> theScore
。如果有人能指出我正确的直接,我真的很感激。
这就是我所拥有的:
vector<string> HighScore::loadScore()
{
ifstream loadFile("scorefile.txt");
string name;
int score;
vector<string> theScore;
string builder;
if (loadFile.is_open())
{
while (!loadFile.eof())
{
loadFile >> name >> score;
builder = to_string(score) + "\t";
builder = builder + name;
//Add all entries to vector List
theScore.push_back(builder);
}
//Sort all entries in score to descending order (Reverse)
std::sort(theScore.rbegin(), theScore.rbegin() +theScore.size());
}
return theScore;
}
答案 0 :(得分:2)
我不太清楚你要做什么,但我希望如此
你想要定义一个包含必要的类
信息,以及operator>>
和operator<<
。所以
你最终会得到类似的东西:
std::vector<Entry> data;
Entry entry;
while ( loadFile >> entry ) {
data.push_back( entry );
}
如果Entry
类似于:
struct Entry
{
int score;
std::string name;
};
然后您的operator>>
可能如下:
std::istream&
operator>>( std::istream& source, Entry& dest )
{
Entry results;
source >> results.score >> results.name;
if ( source ) {
dest = results;
}
return source;
}
(或者你可能想读一行并解析它,以便 允许名称中的空格。)
要排序,您可以定义简单的比较运算符:
struct ByScore
{
bool operator()( Entry const& lhs, Entry const& rhs ) const
{
return lhs.score < rhs.score;
}
};
并将实例传递给std::sort
:
std::sort( data.begin(), data.end(), ByScore() );
(我可能会补充:while ( !loadFile.eof() )
不正确,因为
在没有先验证它们的情况下使用>>
的结果
已成功。)
答案 1 :(得分:1)
使用类或结构。在这种情况下,结构可能非常好:
struct Score
{
int score;
std::string name;
};
答案 2 :(得分:0)
您可以使用std::pair
:
std::vector<std::pair<int, std::string>> theScores;
或者您也可以使用std::tuple
。
或者,只是,您知道,使用想要成员的结构。
答案 3 :(得分:0)
查看http://en.cppreference.com/w/cpp/utility/pair
您需要包含实用程序头文件
如果您的数据结构变得更复杂,您可能希望按照其他人的建议进行操作并创建自己的数据结构。
示例强>
std::pair<std::string, std::string> foo;
foo = std::make_pair("foo", "bar");
// As a vector incorporating std::pair
std::vector< std::pair<std::string, std::string> > bar;
// Probably a good time to use typedef
typedef std::pair<std::string, std::string> foo_pair;
std::vector<foo_pair> qux;
您可以简单地将该对用作std :: vector
中的参数由于这是一个示例,您必须根据需要将模板参数更改为int和string
其他强>
您可以使用std :: tuple但是您需要确保您的编译器支持C ++ 11
答案 4 :(得分:0)
您要找的是std::pair<>
。
您的矢量类型为std::vector< std::pair<int, std::string> >
。
答案 5 :(得分:0)
我把5美分放在std::vector<std::tuple<int, std::string> >
上,如果你愿意,可以在元组中加入其他类型。使用std::make_tuple()
创建元组。