iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++之list容器如何使用
  • 403
分享到

C++之list容器如何使用

2023-07-05 02:07:04 403人浏览 薄情痞子
摘要

今天小编给大家分享一下c++之list容器如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、list底层结构list

今天小编给大家分享一下c++之list容器如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    一、list底层结构

    list底层是带头节点的双向循环链表

    • 双向:可以从前往后,也可以从后往前遍历

    • 循环:找尾节点的时间复杂度为O( 1 )

    • 带头节点:代码实现简单,不用考虑链表为空等特殊情况,可令end()迭代器指向头节点的位置

    C++之list容器如何使用

    二、构造方法

    构造函数

    list<int> l1;list<int> l2(5, 3);//迭代器vector<int> v{ 1,2,3,4,5 };list<int> l3(v.begin(), v.end());//C++11list<int> l4{ 1,2,3,4,5 };

    C++之list容器如何使用

    拷贝构造函数

    利用l1拷贝构造l2

    list<int> l1{ 1,2,3,4,5 };list<int> l2(l1);

    C++之list容器如何使用

    三、元素访问和迭代器

    back&front

    list<int> l1{ 1,2,3,4,5 };cout << l1.front() << endl;cout << l1.back() << endl;

    C++之list容器如何使用

    三种遍历方式

    list<int> l1{ 1,2,3,4,5 };

    采用下面三种方式对下面这个list<int>类型的对象进行遍历打印:

    1.迭代器

    list<int>::iterator it = l1.begin();for (it; it != l1.end(); it++){cout << *it << " ";}cout << endl;

    打印结果:

    C++之list容器如何使用

    2.范围for

    注意这里e是int类型,不用再进行解引用

    //范围forfor (auto e : l1){cout << e << " ";}cout << endl;

    打印结果:

    C++之list容器如何使用

    3.反向迭代器

    list<int>::reverse_iterator rit = l1.rbegin();for (rit; rit != l1.rend(); rit++){cout << *rit << " ";}cout << endl;

    打印结果:

    C++之list容器如何使用

    四、元素修改

    尾插、头插、尾删、头删

    C++之list容器如何使用

    insert、erase

    list支持任意位置的插入,注意list对象的迭代器不支持加减数字,因为其底层空间不连续,如图:

    C++之list容器如何使用

    如果要往一个位置进行插入,可以通过find函数返回位置进行,find是一个通用的函数模板,返回值是传入参数的迭代器类型,

    list<int> l1{ 1,2,3,4,5 };l1.insert(find(l1.begin(), l1.end(), 3), 10);//任意位置插入l1.erase(find(l1.begin(), l1.end(), 10), l1.end());//任意位置的删除

    C++之list容器如何使用

    swap

    list内置的交换函数

    list<int> l1{ 1,2,3,4,5 };list<int> l2{ 5,6,7,8,9 };l1.swap(l2);

    C++之list容器如何使用

    resize

    resize改变有效元素的个数,多的元素用第resize二个参数填充,如果没有给第二个参数,则默认用T()。

    list<int> l1{ 0,1,2 };l1.resize(5, 3);

    C++之list容器如何使用

    五、特殊操作

    remove

    删除值为value的元素

    list<int> l1{ 3,0,1,3,2,3 };l1.remove(3);

    C++之list容器如何使用

    remove_if

    remove_if的参数是一个判断条件,可以是函数指针或者函数对象

    //判断5的倍数bool MultipleFive(int n){return 0 == n % 5;}void Test10(){//此处传递函数指针list<int> l1{ 10,0,1,3,5,7,20 };l1.remove_if(MultipleFive);}

    C++之list容器如何使用

    unique、sort

    unique,去重,删除所有重复元素,使用unique之前要先调用sort进行排序,这里的sort是list内置的sort,不是标准库中的sort

    void Test(){list<int> l1{ 1,3,3,5,4,0,2,5,4 };l1.sort();//默认升序l1.unique();//删除重复元素}

    结果:

    C++之list容器如何使用

    对于sort的使用,还可以自定义函数,并将函数指针作为参数传递给sort函数进行排序:

    C++之list容器如何使用

    reverse

    对链表进行逆置

    void Test(){ list<int> l1{ 1,3,5,7,9 };l1.reverse();}

    结果:

    C++之list容器如何使用

    六、list迭代器失效问题

    list底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。 

    erase导致的迭代器失效

    如图所示,it迭代器所指向的位置被删除后,迭代器失效:

    C++之list容器如何使用

    改正方法:

    while (it != l1.end()){//it=l1.erase(it);l1.erase(it++);}

    这里 l1.erase(it++)语句也能达到效果,因为后置++会将自增后的结果保存在临时变量中,而前置则不可以。 

    resize导致的迭代器失效

    resize减少有效元素个数也会导致迭代器失效:

    list<int> l1{ 1,3,5,7,9 };auto it = l1.end();l1.resize(3);

    上面这个程序中,reseze减少有效元素个数后,it指向的位置元素已经被删除,迭代器失效,如果再使用该迭代器,则会出错。

    七、vector与list对比

    vector(动态顺序表)

    C++之list容器如何使用

    list(带头结点的双向循环链表)

    C++之list容器如何使用

    对比vectorlist
    底层结构动态顺序表&#xff0c;连续空间带头结点的双向循环链表
    访问支持随机访问&#xff0c;首地址+下标不能随机访问&#xff0c;可通过find查找&#xff0c;访问随即元素时间复杂度O(N)
    插入删除任意位置插入和删除效率低&#xff0c;需要搬移元素&#xff0c;时间复杂度为O(N)&#xff0c;插入时有可能需要增容&#xff0c;增容&#xff1a;开辟新空间&#xff0c;拷贝元素&#xff0c;释放旧空间&#xff0c;导致效率更低任意位置插入和删除效率高&#xff0c;不需要搬移元素&#xff0c;时间复杂度为O(1)
    空间利用率底层为连续空间&#xff0c;不容易造成内存碎片&#xff0c;空间利用率较高&#xff0c;缓存利用率高。可以一次将一个数据附近的空间都加载到缓存&#xff0c;不用频繁地从内存读取数据底层节点动态开辟&#xff0c;容易造成内存碎片&#xff0c;空间利用率低&#xff0c;缓存利用率低
    迭代器原生态指针对指针进行了封装
    迭代器失效容量相关的操作都有可能导致迭代器失效&#xff0c;如插入引起的扩容&#xff0c;删除元素等插入元素不会导致迭代器失效&#xff0c;删除节点会导致&#xff0c;且只影响当前迭代器&#xff0c;其他迭代器不受影响
    使用场景不关心插入和删除效率&#xff0c;支持随机访问大量插入和删除操作&#xff0c;不关心随机访问的场景

    以上就是“C++之list容器如何使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网其他教程频道。

    --结束END--

    本文标题: C++之list容器如何使用

    本文链接: https://www.lsjlt.com/news/349095.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • C++之list容器如何使用
      今天小编给大家分享一下C++之list容器如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、list底层结构list...
      99+
      2023-07-05
    • C++之list容器介绍及使用方式
      目录一、list底层结构二、构造方法构造函数拷贝构造函数三、元素访问和迭代器back&front三种遍历方式四、元素修改尾插、头插、尾删、头删insert、eraseswap...
      99+
      2023-02-05
      C++ list容器 list容器介绍 list容器使用
    • C++中list容器如何实现
      本篇内容介绍了“C++中list容器如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、list容器1.1 简介① 功能:将数据进行链...
      99+
      2023-07-05
    • C++之list容器模拟怎么实现
      这篇“C++之list容器模拟怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++之list容器模拟怎么实现”文章吧...
      99+
      2023-07-05
    • C++之list容器模拟实现方式
      目录总述一、节点类二、迭代器类成员变量构造函数*重载->重载“++”“==“和”!=”三、反向迭代器类成...
      99+
      2023-02-05
      C++ list容器 list容器模拟实现 模拟实现list
    • C++ List链表如何使用
      这篇文章主要介绍“C++ List链表如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++ List链表如何使用”文章能帮助大家解决问题。1. list的介绍及使用1.1...
      99+
      2023-07-05
    • C++容器Vector如何使用
      今天小编给大家分享一下C++容器Vector如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Vector简介Vecto...
      99+
      2023-06-30
    • C++顺序容器(vector、deque、list)的使用详解
      目录一:STL(Standard Template Library),即标准模板库,是一个高效的C++程序库二:STL组件三:容器四:类型成员五:迭代器六:顺序容器七:顺序容器--向...
      99+
      2024-04-02
    • C++入门之list的使用详解
      目录前言构造的使用1 构造空list2 构造含n个值为val的元素3 拷贝构造4 用迭代区间迭代器接口1 正常迭代接口2 逆向迭代接口容量接口元素访问数据修改头插头删尾插尾删pos位...
      99+
      2024-04-02
    • C++中如何使用deque容器
      这篇文章主要介绍了C++中如何使用deque容器,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 deque 是 double-ended queue 的缩写,又称双...
      99+
      2023-06-15
    • C++如何使用std::vector容器
      这篇文章给大家分享的是有关C++如何使用std::vector容器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言vector实质是C++的一个类,与数组很相似,但是vector的优势是可以动态扩展,不需要考虑...
      99+
      2023-06-20
    • C++中queue容器如何使用
      这篇“C++中queue容器如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++中queue容器如何使用”文章吧。q...
      99+
      2023-07-05
    • C++常见容器如何使用
      本文小编为大家详细介绍“C++常见容器如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++常见容器如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1.概述C++容器属于STL(标准模板库)中的一部...
      99+
      2023-07-05
    • C++中list容器的实现
      目录一、list容器1.1 简介1.2 构造函数1.3 赋值和交换1.4 大小操作1.5 插入和删除1.6 数据存取1.7 反转和排序一、list容器 1.1 简介 ① 功能:将数据...
      99+
      2023-05-13
      C++ list容器
    • Qt学习之容器如何使用
      今天小编给大家分享一下Qt学习之容器如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Qt容器Qt容器主要优点就是在所有...
      99+
      2023-07-05
    • C++中的stack容器如何使用
      这篇文章主要讲解了“C++中的stack容器如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中的stack容器如何使用”吧!stack容器1 简介① stack是一种先进后出的容...
      99+
      2023-07-05
    • 利用C++模拟实现STL容器:list
      目录一、list的介绍二、list的排序三、迭代器1、list的迭代器失效问题2、迭代器的功能分类3、list迭代器的模拟实现4、迭代器价值5、迭代器operator->的重载...
      99+
      2022-12-08
      C++实现STL容器list C++ STL容器list C++ STL容器
    • C++中的map容器如何使用
      这篇“C++中的map容器如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++中的map容器如何使用”文章吧。一、m...
      99+
      2023-07-05
    • C++List容器常用函数接口刨析
      目录一、基本结构二、list的迭代器的构造三、迭代器的实现四、insert,erase五、push_back,push_front,pop_back,pop_front六、构造函数与...
      99+
      2022-11-13
      C++ List容器 C++List容器函数接口
    • C++中常见容器类如何使用
      本篇内容主要讲解“C++中常见容器类如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中常见容器类如何使用”吧!综合示例1. vector:动态数组,支持随机访问#include&nb...
      99+
      2023-07-05
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作