注意事项

  • 双向循环链表
  • 不支持随机访问
  • 因为不支持随机访问,所以也不能用全局的排序算法 sort
  • 一般不支持随机访问的容器会自己提供 sort 方法
  • 自定义类型要指定排序规则

list 操作原理

排序案例

案例描述:将 Person 自定义数据类型进行排序,Person 中属性有姓名、年龄、身高
排序规则:按照年龄进行升序,如果年龄相同按照身高进行降序

class Person{
public:
    Person(string name, int age, int height){
        this->m_name = name;
        this->m_age = age;
        this->m_height = height;
    }
    bool operator<(const Person &p2){
        if(this->m_age == p2.m_age){
            return this->m_height > p2.m_height;
        }
        return this->m_age < p2.m_age;
    }
    void printPerson()const{
        cout << "姓名:" << this->m_name << " 年龄:" << this->m_age << " 身高:" << this->m_height << endl;
    }
private:
    string m_name;
    int m_age;
    int m_height;
};
int main()
{
    list<Person> lp;
    lp.push_back(Person("刘备", 35 , 175));
    lp.push_back(Person("曹操", 45 , 180));
    lp.push_back(Person("孙权", 40 , 170));
    lp.push_back(Person("赵云", 25 , 190));
    lp.push_back(Person("张飞", 35 , 160));
    lp.push_back(Person("关羽", 35 , 200));
    
    for(const auto &p : lp){
        p.printPerson();
    }
    
    cout << "排序后:" << endl;
    lp.sort();
    for(const auto &p : lp){
        p.printPerson();
    }
    
    return 0;
}

输出:

姓名:刘备 年龄:35 身高:175
姓名:曹操 年龄:45 身高:180
姓名:孙权 年龄:40 身高:170
姓名:赵云 年龄:25 身高:190
姓名:张飞 年龄:35 身高:160
姓名:关羽 年龄:35 身高:200
排序后:
姓名:赵云 年龄:25 身高:190
姓名:关羽 年龄:35 身高:200
姓名:刘备 年龄:35 身高:175
姓名:张飞 年龄:35 身高:160
姓名:孙权 年龄:40 身高:170
姓名:曹操 年龄:45 身高:180