ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] # 简介 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相较于vector的连续线性空间,list就显得负责许多,它的好处是每次插入或者删除一个元素,就是配置或者释放一个元素的空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素的移除,list永远是常数时间。 List和vector是两个最常被使用的容器。 List容器是一个双向链表。 ![](https://img.kancloud.cn/3b/a9/3ba9bf515f666c3c2de22a50a888ef0f_722x452.png) * 采用动态存储分配,不会造成内存浪费和溢出 * 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素 * 链表灵活,但是空间和时间额外耗费较大 由于list是一个循环双向链表,迭代器必须能够具备前移、后移的能力,所以list容器提供的是Bidirectional Iterators. List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效。 这在vector是不成立的,因为vector的插入操作可能造成记忆体重新配置,导致原有的迭代器全部失效,甚至List元素的删除,也只有被删除的那个元素的迭代器失效,其他迭代器不受任何影响。 # 常用api ## 构造函数 ~~~ list<T> lstT;//list采用采用模板类实现,对象的默认构造形式: list(beg,end);//构造函数将[beg, end)区间中的元素拷贝给本身。 list(n,elem);//构造函数将n个elem拷贝给本身。 list(const list &lst);//拷贝构造函数。 ~~~ ~~~ list<int> mylist1(10, 6); list<int> mylist2(++mylist1.begin(), --mylist1.end()); ~~~ ## 元素插入和删除 ~~~ push_back(elem);//在容器尾部加入一个元素 pop_back();//删除容器中最后一个元素 push_front(elem);//在容器开头插入一个元素 pop_front();//从容器开头移除第一个元素 insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。 insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。 insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。 clear();//移除容器的所有数据 erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。 erase(pos);//删除pos位置的数据,返回下一个数据的位置。 remove(elem);//删除容器中所有与elem值匹配的元素。 ~~~ ~~~ list<int> mylist; for (int i = 0; i < 10; i++) { mylist.push_back(i); } //2015和2017vs :_Myhead==>_Myhead(),_Mysize==>_Mysize() list<int>::_Nodeptr node = mylist._Myhead->_Next;//头节点的下一个节点 for (int i = 0; i < mylist._Mysize * 2; i++) { cout << "Node:" << node->_Myval << endl;//获取节点数据 node = node->_Next; if (node == mylist._Myhead) { node = node->_Next; } } ~~~ ## 大小操作 ~~~ size();//返回容器中元素的个数 empty();//判断容器是否为空 resize(num);//重新指定容器的长度为num, 若容器变长,则以默认值填充新位置。 如果容器变短,则末尾超出容器长度的元素被删除。 resize(num, elem);//重新指定容器的长度为num, 若容器变长,则以elem值填充新位置。 如果容器变短,则末尾超出容器长度的元素被删除。 ~~~ ## 赋值 ~~~ assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。 assign(n, elem);//将n个elem拷贝赋值给本身。 list&operator=(const list &lst);//重载等号操作符 swap(lst);//将lst与本身的元素互换。 ~~~ ## 数据的存取 ~~~ front();//返回第一个元素。 back();//返回最后一个元素。 ~~~ ## 反转排序 ~~~ reverse();//反转链表,比如lst包含1,3,5元素,运行此方法后,lst就包含5,3,1元素。 sort(); //list排序 ~~~