0

我创建了一个小高分系统,可以保存到文件中,然后根据请求读取/加载。

但是,我正在加载到字符串向量中,因此创建了一个字符串构建器来添加它们并按顺序显示。

但是,我意识到这是一种不好的做法,并且不确定如何获得我想要的结果,即拥有一个可以按分数(降序)顺序以及相应名称排序的数据结构。

理论上我想做的是<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;
}
4

6 回答 6

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() )是不正确的,就像在>>没有首先验证它们是否成功的情况下使用结果一样。)

于 2013-04-10T08:33:36.097 回答
1

使用类或结构。在这种情况下,结构可能非常好:

struct Score
{
    int score;
    std::string name;
};
于 2013-04-10T08:25:56.817 回答
0

你可以这样做std::pair

std::vector<std::pair<int, std::string>> theScores;

或者,您也可以使用std::tuple

或者只是,你知道,使用通缉成员的结构。

于 2013-04-10T08:26:44.030 回答
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

于 2013-04-10T08:26:47.897 回答
0

您要查找的内容称为std::pair<>.

您的向量将是类型std::vector< std::pair<int, std::string> >

于 2013-04-10T08:27:22.717 回答
0

我把我的 5 美分放在 上std::vector<std::tuple<int, std::string> >,如果你愿意,你可以在元组中放置其他类型。用于std::make_tuple()创建元组。

于 2013-04-10T08:33:20.053 回答