最详细STL(三)list

发布时间:2022-07-03 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了最详细STL(三)list脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

list就是链表啦,他的一个结点由两个指针域,一个数据域组成。list可以在任何位置以O(n)的复杂度插入元素,头部和尾部的插入的复杂度为O(1)。然而list也有一个致命的缺点,因为链表的空间申请是离散的,所以访问元素必须得通过迭代器来从头或者尾部遍历到要访问的元素,所以访问元素的@R_640_1304@是O(n)。

一、list的内存空间是不连续的

老规矩,先上代码给你们感受一下list内存的分配情况

#include<cstdio>
#include<list>
using namespace std;

int main()
{
    list<int > a(30);
    for(int i=0;i<30;i++)
    {
        PRintf("%dn", &amp;a.front());
        a.pop_front();
    }
}

最详细STL(三)list

 

从箭头标记的地方可以看到内存直接从118多跳到了117多,然后从连续的内存中看到,一个list<int>的结点占了24个bytes,其中每个指针域8个bytes,每个int数据域占4bytes,前面也说了,一个list结点有俩指针域,一个数据域所以一共20个bytes。再根据字节对齐原则(可以参考:番外1 什么?sizeof(list<int>)竟然是24 - zju_cxl - 博客园 (cnblogs.COM)),所以就是24个bytes了。

综上,list结点的内存是随机分布的,每个结点比单个数据变量占用的内存至少要多16个bytes。

 

下面开始正文了,我来告诉大家list什么时候用?怎么用?用的时候要注意些什么吧?

二、什么时候用

当不需要查询list中的值,或者需要频繁的在list中间插入值的时候,可以用list

三、怎么用

1.元素访问

lt.front() 查询list头元素
lt.back() 查询list尾元素
lt.begin() 生成头部迭代器
lt.end() 生成尾部迭代器

在迭代器的前面加r如lt.rbegin(),表示从右往左的迭代器,在迭代器前加c,表示用返回常量指针(可以用auto来接收,不用写那些又长又臭的std)

2.添加元素

lt.push_back() 尾部添加
lt.push_front() 头部添加
lt.insert(pos, elem) 指定位置添加
lt.insert(pos, n , elem) 指定位置添加n个值
lt.insert(pos, begin, end) 指定位置添加begin到end的值

 

3.删除元素

lt.pop_back() 删除list尾元素
lt.pop_front() 删除list头元素
lt.erase(begin, end) 删除指定区间的元素
lt.erase(posITion) 删除position位置的元素
lt.remove(elem) (所有)值为elem的就移除
lt.remove_if(bool) (所有)如果真,则移除

 

4.实用函数

lt.splice() 分割list
lt.sort() 排序list
lt.merge() 合并
lt.reverse() 反转

 

四、用的时候要注意什么?

先空着以后再填哈哈,

 

脚本宝典总结

以上是脚本宝典为你收集整理的最详细STL(三)list全部内容,希望文章能够帮你解决最详细STL(三)list所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。