持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情
1、 list 容器介绍
list容器简介
list 容器:又称双向链表容器,该容器的底层是以双向链表的形式实现的,因此可以高效地进行元素的插入和删除操作。
双向链表可以将链表里的元素存储在不同且不相关的内存位置,所以list 容器中的元素可以是分散存储在内存空间里的,而不是必须存储在一整块连续的内存空间中。
在双向链表的任何位置插入或删除元素时间复杂度为都为O(1);list 容器移动元素的效率也比其它容器高。
list容器底层实现
双向链表的各个节点中不仅存储元素的值,还包含两个指针(头指针和尾指针),分别指向该元素的前一个节点和后一个节点,
list 容器各元素占用的节点是独立的、分散的,它们之间的线性关系通过指针来维持。
双向链表第一个元素的头指针总为空指针,因为它前面没有元素;双向链表的最后一个元素的尾指针也总为空指针。
list容器的优缺点
优点:
- 采用动态内存分配,不会造成内存浪费和溢出
- 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
缺点:
- 不能随机访问元素。只能顺序访问,额外耗费较大
2、list容器的构造函数
默认构造
语法:list<T> values;
创建一个int类型的空 list 容器:
list<int> l;
赋值构造
语法1:list<T> values(n); 创建一个包含 n 个元素的 list 容器,每个元素的值都为相应类型的默认值
语法2:list<T> values(n,elem); 创建一个包含 n 个元素的 list 容器,每个元素的初始值为elem
list<int> L2(6);
list<int> L3(6,8);
拷贝相同类型构造
语法:list<T> value2(const list &lst); 里外容器存储的元素类型要一致
list<int> L3(6,8);
list<int> L4(L3);
拷贝不同类型构造
拷贝其他类型容器(或者普通数组)中指定区间内的元素,可以创建新的 list 容器
代码实例:
#include<iostream>
using namespace std;
#include<list>
#include<array>
void printList(const list<int>& L)
{
for (list<int>:: const_iterator it = L.begin();it != L.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test1(){
//默认构造
list<int> L1;
printList(L1);
//赋值构造
list<int> L2(6);
printList(L2);
list<int> L3(6,8);
printList(L3);
//拷贝构造
list<int> L4(L3);
printList(L4);
//拷贝普通数组,创建list容器
int a[] = { 1,2,3,4,5 };
list<int> L5(a, a + 4);
printList(L5);
//拷贝其它类型的容器,创建 list 容器
array<int, 5> arr{ 11,12,13,14,15 };
list<int> L6(arr.begin() + 2, arr.end());
printList(L6);
}
int main()
{
test1();
system("pause");
return 0;
}