走近STL -- 你好,List
时间:2022-07-23
本文章向大家介绍走近STL -- 你好,List,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、你好,List
从实现层面看,相较于Vector的线性空间,List的实现要复杂的多。 List的优势在于每次插入或删除一个元素,就分配或释放一个位置。因此,List对于空间的把控有绝对的精准。 而且,对于从任何节点增删数据,List消耗的永远是常数时间。
List和Vector的使用应该视元素的多寡、元素的构造复杂度、元素的存取频繁度而定。List优在存取,Vector优在查询。
2、List节点
每一个自己写过链表的人都知道,链表的节点和链表本身是分开设计的。 那我们来看一下List的节点设计:
template <typename T>
struct __list_node
{
typedef void* void_pointer;
void_pointer prev;
void_pointer neet;
T date;
}
显而易见,这是一个通用双向链表的节点(如果对通用链表不了解,建议一定要自己动手设计一个)。
3、List基本函数使用
- 创
#include<list>
typedef struct rect
{
···
}Rect;
list<Rect>test; //声明一个链表,用于存放结构体数据
//如果想以其他方法初始化list列表,可以移步到下一行那个Vector的介绍
- 增
Rect a;
···
test.push_back(a);
test.push_front(a);
//头尾插入(双向链表)
//定点插入
test.insert(test.begin()+10,a); //在第十个节点之前插入a
- 删
//删除test头部的元素
test.erase(test.begin());
//删除test从头到尾的元素
test.erase(test.begin(), test.end());
test.pop_back();
test.pop_front();
其实增删还是推荐使用迭代器来,因为直接对数据进行操作会存在一定的危险。 在本文第三部分详细讲述了List迭代器操作增删。
除了这个函数:test.clear();
这个函数安全得很,反正都清理掉了。
- 查、改
//迭代器
list<int>::iterator p;
for (p = test.begin(); p != test.end(); p++)
cout << *p << " ";
要遍历还是首推迭代器。所有和遍历有关的还是用迭代器。
- 排
#include<algorithm>
test.sort(test.begin(),test.end()); //从头到尾,默认从小到大排序
//一般排序都是要自定义排序的:
bool Comp(const int &a,const int &b)
{
return a>b;
}
sort(test.begin(),test.end(),Comp); //这样就降序排序。
- 大小
test.size(); //容器已存入数据量
test.capacity(); //容器还能存多少数据量
//其实不用担心容器不够大,容量要满的时候它会自己扩容
- 其他 (1)压缩list
//去除重复的元素至只保留一个副本
test.unique();
//已经过大小排序的list才能使用
(2)合并list
test.splice(test.end(),test2);//将test2剪切到test后面
最后还是要提一下头文件: 分不清楚就都写上
#include<algorithm>
#include<list>
4、迭代器
List的迭代器和Vector还是有一定区别的,所以我特地分一块出来。 List的迭代器不能随便用普通指针来替代,因为其节点不会在内存中持续存在。
List的迭代器在有一个很好的特性,就是它不会因为节点的增加或合并(splice)操作而失效,即使是删除,也只会使得当前指向被删节点的那个迭代器失效,而不会因记忆体的重置使得全部的迭代器失效。
- TensorFlow-1: 如何识别数字
- 你应该知道的Java垃圾收集器 - 串行、并行、CMS、G1
- ckplayer 如何在PC上完美支持 m3u8播放
- TensorFlow-2: 用 CNN 识别数字
- js图片前端预览之 filereader 和 window.URL.createObjectURL
- TensorFlow-3: 用 feed-forward neural network 识别数字
- TensorFlow-4: tf.contrib.learn 快速入门
- TensorFlow-5: 用 tf.contrib.learn 来构建输入函数
- 前后端分离之vue2.0+webpack2 实战项目 -- html模板拼接
- 抛弃vue-resource拥抱axios
- TensorFlow-6-TensorBoard 可视化学习
- TensorFlow-7-TensorBoard Embedding可视化
- windows下nginx的安装及使用方法入门
- Scala Turtuial-容器(集合)类型
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 比较NaN和数字
- GO 的方法集
- 轻松应对并发问题,简易的火车票售票系统,第一步 —业务分析
- 【Spark Operator】核数设置Cores/Cores Limit/Cores Request,你搞清楚没有?
- 【Ceph RGW】radosgw_usage_exporter监控用户使用量
- 【Goland】#{key}=#{value},字符串被格式化了?
- Variable变量
- 案例:OGG目标端进程ABENDED处理
- Elasticsearch深分页以及排序查询问题
- 聊聊dubbo-go的HystrixFilter
- 如何将Java工程导出成可以执行的jar
- 利用JSP内置的Application对象实现的网站引用计数
- JSP导入XML不成功的一个原因
- 生产环境日志清理脚本
- fastadmin插件开发之插件目录