目录
一.list的介绍
list列表是序列容器,允许在序列内的任何位置执行插入元素或者删除元素等操作。list列表容器的底层是由链表封装而成,并且该链表的类型还是带头双向循环链表。
二.list类成员函数的讲解
对于list容器的成员函数们, 它们与vector与String容器的功能作用相差不大,都是增删查改,能够通过迭代器遍历或者修改容器中某个元素的数据。由于前者与后两者底层类型的不同,侧面表现出了list容器的使用是即插即用, 不需要扩容缩容,意味着不会有reserve()、shrink_to_fit()等函数,
2.2迭代器
list链表容器的迭代器与String和Vector的迭代器也不同,后两者是使用的原生指针,由于连续地址空间的缘故,指针只需要通过增加或者减少类型的字节,便可以定位到具体的位置。
而对于List容器而言,它的元素是一个接一个的节点,每个节点是由指针相连,所以各个节点的地址并不是连续的,那么使用原生指针去寻找元素位置会相当复杂,所以list的迭代器是一种新型迭代器,采用自定义类型制造而出。
虽说list迭代器的底层与string,vector的迭代器并不同,但是使用方式都一样:
vector<T>:: iterator vt=v.begin();
String:: iterator st=s.begin();
list<T>::iterator lt=l.begin();
都是通过类域加作用域限定符 iterator的方式去定义。
在迭代器中,也是分为普通迭代器、const迭代器、反向迭代器、const反向迭代器。其各个成员作用也与之前讲String、vector容器一样,这里就不再过多讲解了。不清楚的话可以翻一翻我之前写的String和vector容器的讲解.
这里直接上练习代码:
#include<iostream>
#include<list>
int main(){
list<int> l1;
l1.push_back(1);
l1.push_back(2);
l1.push_back(3);
l1.push_back(4);
for (auto& e:l1) {
cout << e << " ";
}
cout << endl;
list<int>::iterator lit1 = l1.begin();
while (lit1 != l1.end()) {
cout << ++(*lit1) << " ";
++lit1;
}
cout << endl;
cout << "--------------------------------------------" << endl;
//反向迭代器
list<int>::reverse_iterator lit2 = l1.rbegin();
while (lit2 != l1.rend()) {
cout << ++(*li