STL常用容器—— list 容器介绍和构造函数的使用

233 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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;
 }