如何使用stl向量对类中的字符串进行排序

时间:2013-12-12 23:13:10

标签: c++ class sorting vector stl

我想使用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一起添加在向量中,有没有人有想过这样做?

1 个答案:

答案 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<表示你总是希望按名字排序,这对于名字来说可能不正确。