zoukankan      html  css  js  c++  java
  • 浅谈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);
    

    这里需要注意:

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

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

  • 相关阅读:
    tile38 复制配置
    The Guardian’s Migration from MongoDB to PostgreSQL on Amazon RDS
    tile38 一款开源的geo 数据库
    sqler sql 转rest api 的docker 镜像构建(续)使用源码编译
    sqler sql 转rest api javascript 试用
    sqler sql 转rest api redis 接口使用
    sqler sql 转rest api 的docker image
    sqler sql 转rest api 的工具试用
    apache geode 试用
    benthos v1 的一些新功能
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11835081.html
Copyright © 2011-2022 走看看