如何返回int和字符串?

时间:2013-04-10 08:23:25

标签: c++ map vector

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

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

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

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

6 个答案:

答案 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()创建元组。