list基本概念
功能:
将数据进行链式存储
链表(list)
是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的
链表的组成:链表由一系列结点组成
结点
的组成:一个是存储数据元素的
数据域
,另一个是存储下一个结点地址的
指针域
STL中的链表是一个双向循环链表
由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于
双向迭代器
list的优点:
- 采用用动态存储分配,不会造成内存浪费和溢出
- 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
list的缺点:
- 链表灵活,但是空间(指针域)和时间(遍历)额外消耗较大
特点:
list插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的
总结:
STL中
list
和
vector
是两个最常被使用的容器,各有优缺点
(感觉list跟deque容器在函数语法上还是挺像的,区别在于一个是链式存储,一个是块存储)
list构造函数
函数原型
-
list<T> lst;
//默认构造形式 -
list(beg,end);
//将另一个list容器【beg,end)区间中的数据拷贝给本身 -
list(n,elem);
//将n个elem拷贝给本身 -
list(const list &lst);
//拷贝构造函数
示例
//1、默认构造
list<int>L1;
for (int i = 0; i < 10; i++) {
L1.push_back(i);
}
//2、通过区间方式进行构造
list<int>L2(L1.begin(), L1.end());
//3、n个elem构造
list<int>L3(10, 100); //10个100
//4、拷贝构造,常用
list<int>L4(L3);
list赋值、交换
函数原型
赋值:
-
=
//重载等号操作符 -
.assign(beg,end);
//将另一个list容器【beg,end)区间中的数据拷贝赋值给本身 -
.assign(n,elem);
//将n个elem拷贝赋值给本身
交换:
-
.swap(lst);
//将lst与本身的数据互换
示例
list<int>L1;
for(int i=0; i<10; i++){
L1.push_back(i);
}
//1、operator=赋值
list<int>L2=L1;
//3、assign赋值
list<int>L3;
L3.assign(L1.begin(), L1.end());
//4、n个elem赋值
list<int>L4;
L4.assign(10,100);
list大小操作
函数原型
-
.empty();
//判断容器是否为空 -
.size();
//返回容器中元素的个数 -
.resize(n);
//重新指定容器的长度为n,若容器变长,则以默认值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除 -
.resize(n,elem)
//重新指定容器的长度为n,若容器变长,则以elem值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除
示例
list<int>L1;
for(int i=0; i<10; i++){
L1.push_back(i);
}
//判断容器是否为空
if(L1.empty()){
cout << "L1为空" << endl;
}
else{
cout << "L1不为空" << endl;
}
//判断容器大小,结果为10
cout << "L1的大小为" << L1.size() << endl;
//重新指定容器大小
L1.resize(15);
list插入、删除
函数原型
插入:
-
.push_front(elem);
//头部插入元素elem -
.push_back(elem);
//尾部插入元素elem -
.insert(pos, elem);
//在pos位置插入元素elem,返回新数据的位置 -
.insert(pos, n, elem);
//在pos位置插入n个元素elem -
.insert(pos,beg,end);
//在pos位置插入另一个容器【beg,end)区间的数据
删除:
-
.pop_front();
//删除第一个元素 -
.pop_back();
//删除最后一个元素 -
.erase(pos);
//删除迭代器指向的元素,返回下一个数据的位置 -
.erase(beg, end);
//删除【beg,end)之间的数据,返回下一个数据的位置 -
.clear();
//删除容器中
所有数据
-
.remove(elem)
//删除容器中
所有与elem值匹配
的元素
list数据获取
list不是连续的存储空间,所以不能用
.at()
或者
[]
来获取元素,其迭代器(双向迭代器)不支持随机访问,但支持++或–操作
函数原型
-
.front();
//返回第一个元素 -
.back();
//返回最后一个元素
list反转、排序
函数原型
-
.reverse();
//反转链表 -
.sort()
//链表排序,默认升序(记得包含头文件
<algorithm>
)
另外,对于那些支持随机访问的容器(如deque),它们的排序算法为:
sort(beg,end)
如果想对容器进行降序排列,需要编写一个bool函数作为排序规则,代入到sort函数中
示例:bool myCompare(int v1,int v2){ //降序,让第一个数 > 第二个数 return v1 > v2; } …… list<int> L; L.sort(myCompare); //指定按照myCompare规则,从大到小