• 浅谈C++ STL list 容器


    浅谈C++ STL list 容器

    本篇随笔简单讲解一下(C++STL)(list)容器的使用方法和使用技巧。

    list容器的概念

    学习过(C++STL)的很多同学都知道,(STL)(标准模板库)中的容器其实都是我们在算法竞赛中常用数据结构的一些模板。比如说(queue)模拟的队列,(priority\_queue)模拟的堆等等。那么,我们可以把(list)理解为模拟数据结构中“双向链表”的模板。

    关于双向链表的基本概念以及手动模拟实现,如有不懂的同学可以看这里:

    详解数据结构—链表

    简单来讲,链表就是数组的一个优化结构,它支持在任意两个元素中插入,也支持删除任意元素后把被删除元素的前后两个元素拼接在一起。

    list容器的声明

    (list)容器的声明和大部分(STL)容器的声明方式一样,都是:容器名<变量类型> 名称的结构。值得一提的是,(list)容器需要开#include<list>模板库。

    #include<list>
    list<int> l;
    list<char> l;
    list<pair<int,int> > l;
    list<node> l;
    struct node{...};
    

    list容器的使用

    与其他STL容器相似的用法

    用法 作用
    l.begin(),l.end() 返回list的首、尾迭代器
    l.front(),l.back() 返回list的首、尾元素
    l.push_back() 在链表后插入一个元素
    l.push_front() 在链表前插入一个元素
    l.pop_back() 在链表后删除一个元素
    l.pop_front() 在链表前删除一个元素
    l.clear() 清空链表
    l.size() 返回链表中元素的个数
    l.empty() 判断链表是否为空

    插入操作

    因为(list)支持在任意位置插入和删除,所以如果只能使用(push\_front())(pop\_front())这种类型的成员函数未免就让它失去了链表的名头。

    (list)中,我们使用(insert())函数来支持在任意位置加入元素。原理很简单,上传两个参数,一个是位置参数,一个是值的参数。注意,这里上传的位置参数需要时一个迭代器。这样,插入之后,这个插入元素会在迭代器指向元素的前一位

    类似:

    l.insert(it,val);
    

    删除操作

    删除操作有两种:一种是删除指定元素,一种是删除指定位置。这两种删除操作贴心地规划了用户在实际编写时可能遇到的问题。

    其实也很简单啊。

    如果删除的是某位置的元素,直接传这个位置的迭代器。

    remove(it);
    

    如果删除的是某个值,就直接传这个值:

    remove(val);
    

    这里需要注意:

    • 如果删除的是值,会删除当前链表中所有的这个值。

    • 如果删除的是位置上的元素,会导致这个迭代器从此失效,除非对其重新赋值,否则对其的所有操作都是错误的。这就像植物大战僵尸中的毁灭蘑菇,自己爆炸之后还会留下一个很久才会平的坑(我是颓多了么?)

  • 相关阅读:
    winsows10 小技巧
    数组与智能指针
    卸载 VS2015
    Effective C++
    修改 git commit 的信息
    线程管理
    并发编程简介
    个别算法详解
    git 删除某个中间提交版本
    git 查看某一行代码的修改历史
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11835081.html
Copyright © 2020-2023  润新知