• list容器(20221117)


    一、list容器

    1、基本概念

    功能:将数据进行链式存储

    链表是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过指针实现的

    链表由一系列的节点组成;

    节点的组成:一个是存储数据元素的数据域,另一个是存储下一个节点地址的指针域;

    STL的链表是一个双向循环链表

    链表list中的迭代器只支持前移或后移,属于双向迭代器。

    链表优点:

    1)可以对任意的位置进行快速的插入或删除元素。

    2)采用动态分配内存,不会造成内存的浪费和溢出

    缺点:

    1)容器遍历速度没有数组快。

    2)占用的空间比数组大

    list有一个重要的性质:插入和删除操作都不会造成原有list迭代器失效,这在vector是不成立的。

    2、list构造函数

    与vector构造函数相同;

    如默认构造:

    listL;

    3、赋值和交换操作

    与vector等其他迭代器类似

    函数原型:

    1)assign(beg,end); //将[beg,end]区间赋值

    2)assign(n,elem);

    3)重载=运算符

    4)swap(lst);//将lst与本身元素互换

    4、大小操作

    与vector相同;

    5、list容器的插入与删除操作

    push_back(elem);

    pop_back();

    push_front(elem);

    pop_front();

    insert(pos,elem);

    insert(pos,n.elem);

    insert(pos,beg,end);//在pos位置插入[beg,end) 区间的数据,无返回值

    clear();//移除容器所有数据

    erase(beg,end);//删除容器[beg,end)区间的数据,返回下一个数据的位置

    erase(pos);//删除pos位置的数据,返回下一个数据的位置

    remove(elem);//删除容器中所有与elem匹配的值

    所有的位置不用索引,而是用迭代器

    1. void test02()
    2. {
    3.     //反转和排序
    4.     list<int>L;
    5.     L.push_back(10);
    6.     L.push_back(80);
    7.     L.push_back(30);
    8.     L.push_back(90);
    9.     L.push_back(150);
    10.     printL(L); //10 80 30 90 150
    11.     L.reverse();
    12.     printL(L); //150 90 30 80 10
    13.     L.sort(); //所有不支持随机访问的迭代器不能直接用算法库中的sort形式:sort(beg,end);
    14.     printL(L);//10 30 80 90 150 默认升序
    15. }

    6、数据存取

    front(); //返回第一个元素

    back();//返回最后一个元素

    list在物理上不是连续空间存储的,不能像vector用at()访问某个元素,也不能用[]下标的形式进行访问元素。

    L[0] 不可用;L.at(1);也不可用;

    list迭代器不支持随机访问;

    it++;

    it--;//支持双向

    it=it+1;//不支持,不支持随机访问

    7、list反转和排序

    reverse(); //反转

    sort(); //排序

    8、排序案例

    描述:将Person自定义数据类型进行排序,Person属性中有姓名、年龄、身高

    排序规则:按照年龄进行升序,如果年龄相同则按身高进行降序

    1. class Person {
    2. public:
    3.     string m_name;
    4.     int m_age;
    5.     int m_height;
    6.     Person(string name, int age,int height)
    7.     {
    8.         this->m_name = name;
    9.         this->m_age = age;
    10.         this->m_height = height;
    11.     }
    12. };
    13. //定义排序规则
    14. bool comparePerson(Person &p1,Person &p2)
    15. {
    16.     //按年龄做一个升序
    17.     if (p1.m_age == p2.m_age)
    18.     {
    19.         return p1.m_height < p2.m_height;
    20.     }
    21.     return p1.m_age < p2.m_age;
    22. }
    23. void printLP(list&L)
    24. {
    25.     for (list::iterator it = L.begin(); it != L.end(); it++)
    26.     {
    27.         cout << "姓名:"<<(*it).m_name<< "  年龄:"<<(*it).m_age<<" 身高:"<<(*it).m_height<
    28.     }
    29.     cout << endl;
    30. }
    31. void test03()
    32. {
    33.     //list容器排序案例
    34.     listP;
    35.     //准备数据
    36.     Person p1("L", 18, 199);
    37.     Person p2("I", 16, 177);
    38.     Person p3("A", 19, 192);
    39.     Person p4("O", 20, 190);
    40.     Person p5("C", 20, 167);
    41.     Person p6("H", 20, 187);
    42.     P.push_back(p1);
    43.     P.push_back(p2);
    44.     P.push_back(p3);
    45.     P.push_back(p4);
    46.     P.push_back(p5);
    47.     P.push_back(p6);
    48.     printLP(P);
    49.     cout << "========排序后=======" << endl;
    50.     P.sort(comparePerson); //comparePerson为排序规则 为一个bool值
    51.     printLP(P);
    52. }

    注意:自定义数据类型排序,必须要指定规则。

  • 相关阅读:
    yolov8 c++进行部署
    Qt第六十五章:自定义菜单栏的隐藏、弹出
    终于升级?89年Linux内核C语言“跟上时代”转成现代C
    短链平台设计
    python脚本打包apk-上传到内测平台-企业微信通知
    51单片机学习:LED点阵实验(显示图像)
    vue 修改v-for 循环内的item数据视图不刷新
    【代码随想录】算法训练营 第三天 第二章 链表 Part 1
    react实现步进器
    Postgresql源码(71)子事务数据结构与DDL分析
  • 原文地址:https://blog.csdn.net/qq_60143666/article/details/127911592