介绍
链表是物理存储单元上非连续,非顺序的,数据结构元素的逻辑顺序是通过链表中的指针链接次序实现的。 对于任何位置上元素插入或元素的移除,list永远是常数时间(固定步骤),list容器是一个双向链表。
○ . 采用动态内存分配,不会造成内存浪费和溢出
○ . 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
○ . 链表灵活,但是空间和时间额外消耗较大
list容器的迭代器
○ . list容器不能像vector<>一样以普通指针作为迭代器,因为其节点不能保证在同一块连续的内存空间上。
○ . 由于list是一个双向链表,迭代器必须能够具备前移,后移的能力,所以list容器提供的是Bidirectional Itreatirs
○ . list容器的插入和删除操作都不会造成原有list迭代器的失效,而vector在插入可能造成内存空间的重新配置(复制->找更大的空间),会导致原有的迭代器全部失效。至于list元素的删除,只有被删除的元素的迭代器失效,其他迭代器不会受到影响。
○ . list容器不仅是一个双向链表,而且还是一个循环的双向链表。
操作
一些基本操作和其他容器类似
- 头文件 list
- remove(elem);//删除容器中所有与elem值匹配的元素。
○ . 在remove自定义类时候,需要对 "= ="进行重载。 - swap(lst);//将lst与本身的元素互换。
- reverse();//反转链表,比如lst包含1,3,5元素,运行此方法后,lst就包含5,3,1元素。
- sort(); //list排序 所有不支持随机访问的迭代器,不可以用系统提供的算法,如果不支持用系统提供算法,那么这个类内部会提供,默认升序,降序自己设置仿函数(回调函数)在c中调用的快排算法,回调函数返回值是int,所以可以return a-b, 在c++库中回调被定义为bool型只有0和1,所以应该返回return a>b(a<b);
- 高级排序(自定义类,可以多次比较排序)
bool mycompareper(Person &p1,Person &p2){
if(p1.m_age == p2.m_age)
return p1.m_height < p2.m_height;
return p1.m_age < p2.m_age;
}