• 【c++】list详细讲解


    > 作者简介:დ旧言~,目前大二,现在学习Java,c,c++,Python等
    > 座右铭:松树千年终是朽,槿花一日自为荣。

    > 目标:熟悉list库

    > 毒鸡汤:你的脸上云淡风轻,谁也不知道你的牙咬得有多紧。

    > 望小伙伴们点赞👍收藏✨加关注哟💕💕 

    🌟前言

    今天咱们学习list,咱们还是依照官网来学习:list::list - C++ Reference (cplusplus.com)

    ⭐主体

    1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
    2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。
    3. list与forward_list非常相似:主要不同在于forward_list是单链表,只能单方向迭代。
    4. 与其他的序列式容器相比(array,vector,deque),list在任意位置进行插入、移除元素的执行效率更好。
    5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置。
    6. list还需要一些额外的空间,以保存每个节点的相关联信息。

    咱们按照下面的图来学习list:

    🌙list构造

    这里就和vector的接口相似,我们这里简单举例就行:

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main()
    6. {
    7. // 构造int类型的空容器
    8. list<int> lt1;
    9. // 构造含有3个2的int类型容器
    10. list<int> lt2(3, 2);
    11. for (auto e : lt2)
    12. {
    13. cout << e << " ";
    14. }
    15. cout << endl;
    16. // 拷贝构造lt2
    17. list<int> lt3(lt2);
    18. for (auto e : lt3)
    19. {
    20. cout << e << " ";
    21. }
    22. cout << endl;
    23. string s("hello");
    24. // 利用迭代器构造
    25. list<char> lt4(s.begin(), s.end());
    26. return 0;
    27. }

    运行结果:

    🌙list 插入和删除数据

    函数声明接口说明
    push_front在list首元素前面插入元素
    pop_front删除list首元素
    push_back在list尾部插入元素
    pop_back在list尾部删除元素
    insert在list指定的pos位置插入元素
    erase在list指定的pos位置删除元素

    💫push_front和pop_front

    举例:

    1. int main()
    2. {
    3. list<int> lt;
    4. // 头插数据
    5. lt.push_front(1);
    6. lt.push_front(2);
    7. lt.push_front(3);
    8. lt.push_front(4);
    9. lt.push_front(5);
    10. for (auto e : lt)
    11. {
    12. cout << e << " ";
    13. }
    14. cout << endl;
    15. // 头删数据
    16. lt.pop_front();
    17. for (auto e : lt)
    18. {
    19. cout << e << " ";
    20. }
    21. cout << endl;
    22. return 0;
    23. }

    运行结果:

    💫push_back和pop_back

    举例:

    1. int main()
    2. {
    3. list<int> lt;
    4. // 尾插数据
    5. lt.push_back(1);
    6. lt.push_back(2);
    7. lt.push_back(3);
    8. lt.push_back(4);
    9. lt.push_back(5);
    10. for (auto e : lt)
    11. {
    12. cout << e << " ";
    13. }
    14. cout << endl;
    15. // 尾删数据
    16. lt.pop_back();
    17. for (auto e : lt)
    18. {
    19. cout << e << " ";
    20. }
    21. cout << endl;
    22. return 0;
    23. }

    运行结果:

    💫insert

    使用说明:

    1. 在指定位置插入数据。
    2. 在指定位置插入n个值为val的数。
    3. 在指定位置插入一段迭代器区间(左闭右开)。

    举例:

    1. int main()
    2. {
    3. list<int> lt;
    4. lt.push_back(1);
    5. lt.push_back(2);
    6. lt.push_back(3);
    7. lt.push_back(4);
    8. lt.push_back(5);
    9. list<int>::iterator pos = find(lt.begin(), lt.end(), 2);
    10. //在2的位置插入0
    11. lt.insert(pos, 0);
    12. for (auto e : lt)
    13. {
    14. cout << e << " ";
    15. }
    16. cout << endl;
    17. pos = find(lt.begin(), lt.end(), 3);
    18. //在3的位置插入3个6
    19. lt.insert(pos, 3, 6);
    20. for (auto e : lt)
    21. {
    22. cout << e << " ";
    23. }
    24. cout << endl;
    25. vector<int> v{ 7, 7 };
    26. pos = find(lt.begin(), lt.end(), 1);
    27. //在1的位置插入2个7
    28. lt.insert(pos, v.begin(), v.end());
    29. for (auto e : lt)
    30. {
    31. cout << e << " ";
    32. }
    33. cout << endl;
    34. return 0;
    35. }

    运行结果:

    💫erase

    使用说明:

    1. 删除指定位置数据
    2. 删除指定迭代器区间中的数据。

    举例:

    1. int main()
    2. {
    3. list<int> lt;
    4. lt.push_back(1);
    5. lt.push_back(2);
    6. lt.push_back(3);
    7. lt.push_back(4);
    8. lt.push_back(5);
    9. list<int>::iterator pos = find(lt.begin(), lt.end(), 2);
    10. // 删除2
    11. lt.erase(pos);
    12. for (auto e : lt)
    13. {
    14. cout << e << " ";
    15. }
    16. cout << endl;
    17. pos = find(lt.begin(), lt.end(), 3);
    18. //删除3及其之后的元素
    19. lt.erase(pos, lt.end());
    20. for (auto e : lt)
    21. {
    22. cout << e << " ";
    23. }
    24. cout << endl;
    25. return 0;
    26. }

    运行结果:

    🌙list 迭代器的使用

    函数声明接口说明
    begin+end返回第一个元素的迭代器 + 返回最后一个元素位置的迭代器
    rbegin+rend返回最后一个元素位置的迭代器 + 返回第一个元素的迭代器

    说明:begin+end是正向迭代器,rbegin+rend是反向迭代器。

    举例:

    1. int main()
    2. {
    3. string s("hello c++");
    4. list<char> lt(s.begin(), s.end());
    5. // 正向迭代器遍历容器
    6. list<char>::iterator it = lt.begin();
    7. while (it != lt.end())
    8. {
    9. cout << *it << " ";
    10. it++;
    11. }
    12. cout << endl;
    13. // 反向迭代器遍历容器
    14. list<char>::reverse_iterator rit = lt.rbegin();
    15. while (rit != lt.rend())
    16. {
    17. cout << *rit << " ";
    18. rit++;
    19. }
    20. cout << endl;
    21. return 0;
    22. }

    运行结果:

    🌙list 获取数据

    函数声明接口说明
    front返回list的第一个节点值的引用
    back

    返回list的最后一个解节点值的引用

    举例:

    1. int main()
    2. {
    3. list<int> lt;
    4. lt.push_back(1);
    5. lt.push_back(2);
    6. lt.push_back(3);
    7. lt.push_back(4);
    8. lt.push_back(5);
    9. cout << lt.front() << endl;
    10. cout << lt.back() << endl;
    11. return 0;
    12. }

    运行结果:

    🌙list 容量大小

    函数声明接口说明
    empty检测list是否为空,是返回true,反之返回false
    size返回list中元素的个数

    举例:

    1. int main()
    2. {
    3. list<int> lt;
    4. lt.push_back(1);
    5. lt.push_back(2);
    6. lt.push_back(3);
    7. lt.push_back(4);
    8. lt.push_back(5);
    9. cout << lt.size() << endl;
    10. cout << lt.empty() << endl;
    11. }

    运行结果:

    🌙list 相关操作函数

    💫erase

    使用说明:swap用于交换两个容器的内容。

    举个栗子:

    1. int main()
    2. {
    3. list<int> lt1(3, 2);
    4. list<int> lt2(2, 3);
    5. lt1.swap(lt2); //交换两个容器的内容
    6. return 0;
    7. }

    运行结果:

    💫clear

    使用说明:clear用于清空容器,清空后容器的size为0。

    举个栗子:

    1. int main()
    2. {
    3. list<int> lt(5, 6);
    4. lt.clear();
    5. return 0;
    6. }

    运行结果:

    💫sort

    使用说明:sort可以将容器当中的数据排序(升序)。

    举个栗子:

    1. int main()
    2. {
    3. list<int> lt;
    4. lt.push_back(2);
    5. lt.push_back(1);
    6. lt.push_back(4);
    7. lt.push_back(3);
    8. lt.push_back(5);
    9. cout << "排序前:";
    10. for (auto e : lt)
    11. {
    12. cout << e << " ";
    13. }
    14. cout << endl;
    15. lt.sort();
    16. cout << "排序后:";
    17. for (auto e : lt)
    18. {
    19. cout << e << " ";
    20. }
    21. cout << endl;
    22. }

    运行结果:

    💫resize

    使用说明:

    1. 当所给值大于当前的size时,将size扩大到该值,扩大的数据为第二个所给值,若未给出,则默认为容器所存储类型的默认构造函数所构造出来的值。
    2. 当所给值小于当前的size时,将size缩小到该值。

    举个栗子:
     

    1. int main()
    2. {
    3. list<int> lt(3, 0);
    4. for (auto e : lt)
    5. {
    6. cout << e << " ";
    7. }
    8. cout << endl;
    9. //将size扩大为5,扩大的值为4
    10. lt.resize(5, 1);
    11. for (auto e : lt)
    12. {
    13. cout << e << " ";
    14. }
    15. cout << endl;
    16. //将size缩小为2
    17. lt.resize(2);
    18. for (auto e : lt)
    19. {
    20. cout << e << " ";
    21. }
    22. cout << endl;
    23. return 0;
    24. }

    运行结果:

    💫remove

    使用说明:remove可以移除指定元素。

    举个栗子:

    1. int main()
    2. {
    3. list<int> lt;
    4. lt.push_back(1);
    5. lt.push_back(2);
    6. lt.push_back(2);
    7. lt.push_back(3);
    8. lt.push_back(4);
    9. lt.push_back(5);
    10. for (auto e : lt)
    11. {
    12. cout << e << " ";
    13. }
    14. cout << endl;
    15. // 删除容器当中值为2的元素
    16. lt.remove(2);
    17. for (auto e : lt)
    18. {
    19. cout << e << " ";
    20. }
    21. cout << endl;
    22. return 0;
    23. }

    运行结果:

    💫unique

    使用说明:去除连续重复的元素(如果要去除所有重复的元素需要先排序)

    举个栗子:

    1. int main()
    2. {
    3. list<int> lt;
    4. lt.push_back(1);
    5. lt.push_back(2);
    6. lt.push_back(3);
    7. lt.push_back(3);
    8. lt.push_back(2);
    9. lt.push_back(3);
    10. lt.push_back(2);
    11. for (auto e : lt)
    12. {
    13. cout << e << " ";
    14. }
    15. cout << endl;
    16. // 去除连续重复的元素
    17. lt.unique();
    18. for (auto e : lt)
    19. {
    20. cout << e << " ";
    21. }
    22. cout << endl;
    23. lt.sort();
    24. lt.unique();
    25. for (auto e : lt)
    26. {
    27. cout << e << " ";
    28. }
    29. cout << endl;
    30. return 0;
    31. }

    运行结果:

    💫reverse

    使用说明:可以将容器当中元素的进行逆置。

    举个栗子:

    1. int main()
    2. {
    3. list<int> lt;
    4. lt.push_back(1);
    5. lt.push_back(2);
    6. lt.push_back(3);
    7. lt.push_back(4);
    8. lt.push_back(5);
    9. for (auto e : lt)
    10. {
    11. cout << e << " ";
    12. }
    13. cout << endl;
    14. // 逆置
    15. lt.reverse();
    16. for (auto e : lt)
    17. {
    18. cout << e << " ";
    19. }
    20. cout << endl;
    21. return 0;
    22. }

    运行结果:

    🌟结束语

           今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

  • 相关阅读:
    数据分析 - 离散概率分布的运用
    通用轻量级机器人设备 -- 研究和设计要点
    1024程序员节献礼,火山引擎ByteHouse带来三重产品福利
    常用meta整理
    《计算机视觉中的多视图几何》笔记(8)
    Linux 6种日志查看方法
    传输层协议 ——— TCP协议
    数列求和-加强版
    [WUSTCTF 2020]level2 脱壳
    docker本地私有库和harbor仓库
  • 原文地址:https://blog.csdn.net/AAlykk/article/details/135617561