[微信公众号:Cpp入门到精通]有完整六十六节知识,STL知识总结,欢迎关注学习!!
list是一个STL中的双向链表容器。它是一个线性容器,允许在两端(头部和尾部)高效地插入和删除元素,而不需要移动其他元素。那么它和我们之前讲到的deque容器有什么区别呢?
list容器和deque容器的比较:
数据结构:list 使用双向链表实现,每个元素都包含一个指向前一个元素和后一个元素的指针。而deque 使用双端队列实现,它通常由多个块组成,每个块内部是一个固定大小的数组。
随机访问:list不提供随机访问,因为链表不是用连续线性空间存储数据的,必须沿着链表从头或尾遍历来访问元素。而deque提供随机访问,因为每个块内的元素是通过索引直接访问的。
插入删除操作:list在任意位置插入和删除元素的时间复杂度是O(1)。适用于频繁的插入和删除操作。而在两端(头和尾)插入和删除元素的时间复杂度是O(1),在中间的操作可能涉及多个块的移动,不如list容器高效。
空间大小:由于list容器每个元素都有额外的指针开销,可能导致更高的空间使用。
了解了list容器的一般特点以后,我们来介绍一下有关list容器的相关操作,其实容器之间的相关操作大差不差,只有一些细微的区别,是因为它们底层的数据结构不同。
1.包含头文件:
#include<list>
2.构造和赋值:
list<int>l1;//构造一个空链表
list<int>l2(5, 10);//构造一个链表,内容为5个10
list<int>l3(l2);//构造l3,将l2的内容赋值给l3
3.插入和删除元素:
list<int>l1;//构造一个空链表
l1.push_back(10);//尾插
l1.push_back(20);
l1.push_back(30);
l1.push_front(40);//头插
l1.push_front(50);
cout << "尾插,头插元素后:" << endl;
print(l1);
l1.pop_back();
l1.pop_front();
cout << "头删,尾删后:" << endl;
print(l1);
结果如下:
尾插,头插元素后:
50 40 10 20 30
头删,尾删后:
40 10 20
在指定位置插入元素:
list<int>l1={10,20,30,40,50};
print(l1);
list<int>::iterator it=find(l1.begin(), l1.end(), 30);
l1.insert(it, 66);
print(l1);
在这里,我们使用迭代器在指定范围内找到目标元素,并将其位置的迭代器返回给it,如果找不到,就返回end()。l1.insert(it,66)即在it位置前插入66。
结果如下:
10 20 30 40 50
10 20 66 30 40 50
在指定位置删除元素:
list<int>l1={10,20,30,40,50};
print(l1);
list<int>::iterator it = find(l1.begin(), l1.end(), 30);
l1.erase(it);
print(l1);
使用迭代器返回20的位置的迭代器,使用l1.erase(30)可实现删除指定单个元素,也可以通过两个迭代器实现删除指定范围内的元素。
list<int>l1={10,20,30,40,50};
print(l1);
list<int>::iterator it = find(l1.begin(), l1.end(), 20);
list<int>::iterator itend = find(l1.begin(), l1.end(), 40);
if (it != l1.end() && itend != l1.end())
{
l1.erase(it, itend);
}
print(l1);
使用两个it选定第一个元素20,itend选定第二个元素40,l1.erase(it,itend)实现删除[20,40)之间的所有元素。
10 20 30 40 50
10 40 50
4.访问元素:
由于list的链表结构,所以并不支持随机访问。只能通过front()和back()访问首尾元素。
list<int>l1={10,20,30,40,50};
print(l1);
cout << "首元素为:" << l1.front() << endl;
cout << "尾元素为:" << l1.back() << endl;
结果如下:
10 20 30 40 50
首元素为:10
尾元素为:50
5.反转容器:
在C++中,使用reverse()实现反转容器。
list<int>l1={10,20,30,40,50};
print(l1);
l1.reverse();
print(l1);
结果如下:
10 20 30 40 50
50 40 30 20 10
list容器的基本操作先介绍到这里,下节我们继续讲其他操作,感谢观看!欢迎各位的点赞与关注!您的点赞和关注是我学习更新的动力!