2013-04-10 57 views
0

我創建了一個小高分系統,保存到文件,然後根據請求讀取/加載。如何返回一個int和一個字符串?

但是,我加載到一個字符串的向量中,所以創建了一個字符串生成器來添加它們並按順序顯示。

但是,我意識到這是一個糟糕的做法,我不確定如何獲得我想要的結果,這將有一個數據結構,可以按照分數(降序)排序相應的名字。

我想在理論上做的是<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

創建一個具有Siring和int變量的類an d然後返回對象。 – 2013-04-10 08:26:31

回答

1

使用一個類或結構。在這種情況下,一個結構可能是完美的罰款:

struct Score 
{ 
    int score; 
    std::string name; 
}; 
+0

記住你的結構上的分號! – chrisw 2013-04-10 08:31:26

0

您可以用std::pair做到這一點:

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

另外,您可以使用std::tuple爲好。

或者只是,你知道,與通緝的成員一起使用結構。

+2

唯一有效的答案是定義類。您希望會員擁有有意義的名稱(_not_「first」和「second」)。你想支持輸入和輸出(運算符'>>'和'<<')。你想支持不同的比較標準('ByScore'和'ByName')。所有這些都需要一個類類型(可能只有公共成員,並且通過關鍵字'struct'引入,至少在一個簡單的應用程序中)。 – 2013-04-10 08:39:34

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並根據需要串

其他

ÿ你可以使用std :: tuple,但你需要確保你的編譯器支持C++ 11

0

你在找什麼叫做std::pair<>

你的載體將是std::vector< std::pair<int, std::string> >類型。

+0

不。這是非常糟糕的軟件工程:他的元素應該被稱爲'score'和'name',而不是'first'和'second'。 (在編寫良好的軟件中,幾乎從不使用'std :: pair'。) – 2013-04-10 08:34:40

+1

STL本身廣泛使用'std :: pair'(例如關聯容器),我想它是不好的軟件... – user1095108 2013-04-10 09:15:32

0

我把我的5美分放在std::vector<std::tuple<int, std::string> >上,如果你願意的話,你可以在元組中加入其他類型。使用std::make_tuple()來創建元組。

+0

看到我的對@nvoigt的評論。他有獨特的結構,其元素應該有有意義的名稱。 – 2013-04-10 08:35:34

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())是不正確,因爲 是使用的結果>>而不是首先驗證他們 已成功。)

相關問題