• list(链表)容器(二)


    一、list 插入和删除

    函数原型:

    1. push_back(elem);//在容器尾部加入一个元素
    2. pop_back();//删除容器中最后一个元素
    3. push_front(elem);//在容器开头插入一个元素
    4. pop_front();//从容器开头移除第一个元素
    5. insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。
    6. insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
    7. insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
    8. clear();//移除容器的所有数据
    9. erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
    10. erase(pos);//删除pos位置的数据,返回下一个数据的位置。
    11. remove(elem);//删除容器中所有与elem值匹配的元素。

    代码示例:

    1. #include
    2. using namespace std;
    3. #include
    4. void printList(const list<int>& L)
    5. {
    6. for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)
    7. {
    8. cout << (*it) << " ";
    9. }
    10. cout << endl;
    11. }
    12. void test()
    13. {
    14. list<int>L;
    15. //尾插
    16. L.push_back(10);
    17. L.push_back(20);
    18. L.push_back(30);
    19. //头插
    20. L.push_front(100);
    21. L.push_front(200);
    22. L.push_front(300);
    23. //300 200 100 10 20 30
    24. printList(L);
    25. //尾删 300 200 100 10 20
    26. L.pop_back();
    27. printList(L);
    28. //头删 200 100 10 20
    29. L.pop_front();
    30. printList(L);
    31. //insert插入 200 1000 100 10 20
    32. list<int>::iterator it = L.begin();
    33. L.insert(++it,1000);
    34. printList(L);
    35. //删除 200 100 10 20
    36. it = L.begin();
    37. L.erase(++it);
    38. printList(L);
    39. //移除
    40. L.push_back(10000);
    41. L.push_back(10000);
    42. L.push_back(10000);
    43. L.push_back(10000);
    44. printList(L);
    45. L.remove(10000);//删除所有
    46. printList(L);
    47. //清空
    48. L.clear();
    49. printList(L);
    50. }
    51. int main()
    52. {
    53. test();
    54. return 0;
    55. }

    总结:

    尾插 --- push_back        尾删 --- pop_back

    头插 --- push_front        头删 --- pop_front

    插入 --- insert                 删除 --- erase

    移除 --- remove              清空 --- clear  

    二、list 数据存取

    函数原型:

    1. front(); //返回第一个元素。
    2. back(); //返回最后一个元素。

    代码示例:

    1. #include
    2. using namespace std;
    3. #include
    4. void test()
    5. {
    6. list<int>L1;
    7. L1.push_back(10);
    8. L1.push_back(20);
    9. L1.push_back(30);
    10. L1.push_back(40);
    11. //L1[0] 不可以用[]访问list容器中的元素
    12. //L1.at(0) 不可以用at访问list容器中的元素
    13. //原因是list本质为链表,不适用连续线性空间存储数据,迭代器也是不支持随机访问的
    14. cout << "第一个元素为:" << L1.front() << endl;
    15. cout << "最后一个元素为:" << L1.back() << endl;
    16. //验证迭代器是不支持随机访问的
    17. list<int>::iterator it = L1.begin();
    18. it++;//it--,支持双向,但写成it=it+1则出错,不支持随机访问
    19. }
    20. int main()
    21. {
    22. test();
    23. return 0;
    24. }

    总结:

    list容器中不可以通过[]或者at方式访问数据

    返回第一个元素 --- front

    返回最后一个元素 --- back

    三、list 反转和排序

    函数原型:

    1. reverse(); //反转链表
    2. sort(); //链表排序

    代码示例:

    1. #include
    2. using namespace std;
    3. #include
    4. #include
    5. void printList(const list<int>& L)
    6. {
    7. for (list<int>::const_iterator it = L.begin(); it != L.end(); it++)
    8. {
    9. cout << (*it) << " ";
    10. }
    11. cout << endl;
    12. }
    13. void test01()
    14. {
    15. //反转链表
    16. list<int>L1;
    17. L1.push_back(20);
    18. L1.push_back(10);
    19. L1.push_back(50);
    20. L1.push_back(40);
    21. L1.push_back(30);
    22. cout << "反转前:" << endl;
    23. printList(L1);
    24. //反转
    25. L1.reverse();
    26. cout << "反转后:" << endl;
    27. printList(L1);
    28. }
    29. bool myCompare(int v1,int v2)
    30. {
    31. //降序 就让第一个数 > 第二个数
    32. return v1 > v2;
    33. }
    34. //排序链表
    35. void test02()
    36. {
    37. list<int>L1;
    38. L1.push_back(20);
    39. L1.push_back(10);
    40. L1.push_back(50);
    41. L1.push_back(40);
    42. L1.push_back(30);
    43. //排序
    44. cout << "排序前:" << endl;
    45. printList(L1);
    46. //所有不支持随机访问迭代器的容器,不可以用标准算法
    47. // 不支持随机迭代器访问的容器,内部会提供一些对应算法
    48. //sort(L1.begin(), L1.end());
    49. L1.sort();//默认排序规则 从小到大 升序
    50. cout << "排序后:" << endl;
    51. printList(L1);
    52. L1.sort(myCompare);
    53. printList(L1);
    54. }
    55. int main()
    56. {
    57. //test01();
    58. test02();
    59. return 0;
    60. }

    总结:

    反转 --- reverse

    排序 --- sort (成员函数)

    四、排序案例

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

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

    代码示例:

    1. #include
    2. using namespace std;
    3. #include
    4. #include
    5. //list容器 排序案例
    6. class Person
    7. {
    8. public:
    9. Person(string name, int age, int height)
    10. {
    11. this->m_Name = name;
    12. this->m_Age = age;
    13. this->m_Height = height;
    14. }
    15. string m_Name;//姓名
    16. int m_Age; //年龄
    17. int m_Height;//身高
    18. };
    19. //指定排序规则
    20. bool comparePerson(Person& p1, Person& p2)
    21. {
    22. //按照年龄 升序
    23. if (p1.m_Age == p2.m_Age)
    24. {
    25. //年龄相同 按照身高降序
    26. return p1.m_Height > p2.m_Height;
    27. }
    28. else
    29. {
    30. return p1.m_Age < p2.m_Age;
    31. }
    32. }
    33. void test()
    34. {
    35. //创建容器
    36. listL;
    37. //准备数据
    38. Person p1("刘备", 35, 175);
    39. Person p2("曹操", 45, 180);
    40. Person p3("孙权", 40, 170);
    41. Person p4("赵云", 25, 190);
    42. Person p5("张飞", 35, 160);
    43. Person p6("关羽", 35, 200);
    44. //插入数据
    45. L.push_back(p1);
    46. L.push_back(p2);
    47. L.push_back(p3);
    48. L.push_back(p4);
    49. L.push_back(p5);
    50. L.push_back(p6);
    51. for (list::iterator it = L.begin(); it != L.end(); it++)
    52. {
    53. cout << "姓名:" << (*it).m_Name << " 年龄:" << (*it).m_Age << " 身高:" << (*it).m_Height << endl;
    54. }
    55. //排序
    56. cout << "----------------------------" << endl;
    57. cout << "排序后:" << endl;
    58. L.sort(comparePerson);
    59. for (list::iterator it = L.begin(); it != L.end(); it++)
    60. {
    61. cout << "姓名:" << (*it).m_Name << " 年龄:" << (*it).m_Age << " 身高:" << (*it).m_Height << endl;
    62. }
    63. }
    64. int main()
    65. {
    66. test();
    67. return 0;
    68. }

    总结:

    对于自定义数据类型,必须要指定排序规则,否则编译器不知道如何进行排序

    高级排序只是在排序规则上再进行一次逻辑规则制定,并不复杂

  • 相关阅读:
    JavaScript系列之FileReader
    人工智能(pytorch)搭建模型20-基于pytorch搭建文本生成视频的生成对抗网络,技术创新点介绍
    Flume从入门到精通一站式学习笔记
    elasticsearch 认识
    dind(docker in docker)学习
    一下明白@GetMapping、@PostMapping、@PutMapping、@DeleteMapping注解
    Golang recover
    我的创作纪念日
    基于JS的迷宫小游戏
    150.逆波兰表达式求值
  • 原文地址:https://blog.csdn.net/qq_51647149/article/details/137211319