2013-12-12 36 views
-3

我想使用std :: sort對一個名稱列表進行排序。問題是,我只能排序第一名稱,而不是名字和姓氏一起,類我已創建是這樣的:如何使用stl向量對類中的字符串進行排序

class Name{ 
public: 
Name(string first, string last):firstName(first), lastName(last){}; 

string getFirstName() const{ 
    return firstName; 
}; 

string getLastName() const{ 
    return lastName; 
} 

private: 
string firstName; 
string lastName; 
}; 

一旦我得到的姓氏和名字,我把它們存儲在類名,但我從文件中讀取他們,代碼是這樣的

file.open("namelist.txt"); 

vector<string> strvec; 
while (!file.eof()){ 
    string firstName, lastName; 
    file >> firstName; 
    file >> lastName; 
    Name n(firstName,lastName); 
    strvec.push_back(firstName); 

} 

正如你可以看到我店頭名的載體,所以我可以排序使用

sort(strvec.begin(),strvec.end()); 

但我只排序名字而不是所有的一起,使用類的想法是,我可以將它們排序在一起,我的想法是使用vector<Name> strvec,但我不知道如何在向量中一起添加名字和姓氏,有沒有人有想法做到這一點?

回答

1

std::sort提供了插入自己訂購功能的方法。

您需要提供無論是仿函數的排序功能,或低於運營商提供您的姓名類:

struct Name_Compare { 
    bool operator()(const Name& a, const Name& b) { 
     return a.getFirstName() < b.getFirstName(); 
    } 
} 

std::sort(names.begin(), names.end(), Name_Compare()); 

OR:

bool operator<(const Name& a, const Name& b) { 
    return a.getFirstName() < b.getFirstName(); 
} 

std::sort(names.begin(), names.end()); 

或者,如果你與編譯C++ 11,你可以用一個lambda來內聯:

std::vector<Name> names; 

//Add your names... 

std::sort(names.begin(), names.end(), 
      [](const Name& a, const Name& b) { 
       return a.getFirstName() < b.getFirstName() 
      }); 

仿函數或lambda可能是你最好的選擇這裏。爲這個班級製作operator<表示你總是希望按名字排序,這對於名字來說可能並不正確。

相關問題