解决方案
使用 std::sort() 函数对 vector 进行排序,该函数在 algorithm 头文件中
方式:
- 基本数据类型
- 自己定义的类型
示例
-
基本数据类型
直接比较即可
//此处为头文件 void test01() { std::vector<int> vInt{ 1, 2, 3, 4, 5 }; std::sort(vInt.begin(), vInt.end()); //升序 std::sort(vInt.rbegin(), vInt.rend()); //降序 }
-
自己定义的类型
示例:
class Person { public: int age; string name; Person(int age = 0, string name = "张三") : age{ age }, name{ name } {} } Person p[] = { { 11, "hhh" }, { 22, "xxx" }, { 22, "www" } };
编译器不知道Person类型如何相互比较,要提供函数告诉编译器如何比较两个函数
有两种方式
-
重载小于运算符
//此处为头文件 bool Person::operator<(Person &p) { //重载小于运算符 return (this->age < p.age ? true : (this->name < p.name)); } void test02() { std::vector<Person> vPerson; for (int i{ 0 }; i < 3; ++i) { vPerson.push_back(p[i]); } std::sort(vPerson.begin(), vPerson.end()); //升序 std::sort(vPerson.rbegin(), vPerson.rend()); //降序 }
-
提供比较函数
当vector的参数类型是指针时,重载小于运算符无法比较两个指针所指向的内容的大小
此时可以提供比较函数
//此处为头文件 bool cmp(Person *p1, Person *p2) { //提供比较函数 return (p1->age < p2->age ? true : (p1->name < p2->name)); } void test03() { std::vector<Person *> vPerson; for (int i{ 0 }; i < 3; ++i) { vPerson.push_back(p+i); } std::sort(vPerson.begin(), vPerson.end(), cmp); //升序 std::sort(vPerson.rbegin(), vPerson.rend(), cmp); //降序 }
-