我想使用std :: sort对名单进行排序。问题是我只能将名字而不是名字和姓氏排在一起,我创建的类是这样的:
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;
};
获得名字和姓后,我将它们存储在Name类中,但是我从文件中读取它们,代码就像这样
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
但我不知道如何将firstname和lastname一起添加在向量中,有没有人有想过这样做?
答案 0 :(得分:1)
std::sort
提供了插入自己的订购功能的方法。
您需要为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<
表示你总是希望按名字排序,这对于名字来说可能不正确。