一、基本概念
①功能:将数据进行链式存储
链表(list):是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表的指针链接实现的
链表的组成:链表由一系列结点组成。
结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
STL中的链表是一个双向循环链表(两个指针,一个指向前一个结点,一个指向后一个结点)。
链表的迭代器只支持前移和后移,属于双向迭代器。
②优缺点
优点:
采用动态分配,不会造成内存浪费和溢出。
指向插入和删除操作方便,只需修改指针即可。
缺点:
容器遍历速度慢,占用空间大。
list有一个重要性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。
二、构造函数
函数原型
list<T> list; //list采用模板类实现,对象的默认构造形式。
list(beg,end); //构造函数将[beg,end]区间的元素拷贝给本身。
list(n,elem); //构造函数将n个elem拷贝给本身。
list(const list &lst); //拷贝构造函数
三、赋值和交换
功能描述:给list容器进行赋值,以及交换list容器。
函数原型
assign(beg,end); //将[beg,end]区间的数据拷贝赋值给本身
assign(n,elem); //将n个elem拷贝赋值给本身。
list& operator=(const list &list); //重载等号操作符。
swap(lst); //将lst与本身的元素互换。
四、大小操作
函数原型
size(); //返回容器中的个数
empty(); //判断容器是否为空
resize(num); //重新指定容器的长度为num,若容器变长,则以默认填充新位置。
//如果容器变短,则末尾超过长度的元素被删除。
resize(num,elem); //重新指定容器的长度为num,若容器变长,则以elem填充新位置。
//如果容器变短,则末尾超过长度的元素被删除。
五、插入和删除
函数原型
push_back(elem); //在容器尾部加入一个元素
pop_back(); //删除容器中最后一个元素
push_front(elem); //在容器开头插入一个元素
pop_front(); //在容器开头移除第一个元素
insert(pos,elem); //在pos位置插elem元素的拷贝,返回新数据的位置
insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值
insert(beg,end); //在pos位置插入[beg,end]区间的数据,无返回值
clear(); //移除容器的所以数据
erase(beg,end); //删除[beg,end]区间的数据,返回下一个数据的位置
erase(pos); //删除pos位置的数据,返回下一个数据的位置
remove(elem); //删除容器中所以与elem值匹配的元素
六、数据存取
函数原型
front(); //返回第一个元素
back(); //返回最后一个元素
list本身是链表,不是有连续性空间存储数据,迭代器也是不支持随机访问的。
七、反转和排序
函数原型
reverse(); //反转链表
sort(); //链表排序(从小到大)
降序:
bool myCompare(int a, int b)
{
return a > b;
}
void test
{
list<int> stk;
stk.push_back(3);
stk.push_back(1);
stk.push_back(6);
stk.push_back(4);
stk.push_back(7);
stk.sort(myCompare); //将bool函数名传入
}
自定义比较规则时需要自己写个函数指定排序规则
#include <iostream>
#include <string>
#include <vector>
#include<deque>
#include<stack>
#include<list>
#include <algorithm>
using namespace std;
class person
{
public:
person(string name, int age, int high) {
this->name = name;
this->age = age;
this->high = high;
}
string name;
int age;
int high;
};
void show(list<person>& s)
{
for (list<person>::iterator begin = s.begin(); begin != s.end(); begin++) {
cout << "姓名:" << (*begin).name << " 年龄:" << (*begin).age << " 身高:" << (*begin).high << endl;
}
}
//指定排序规则(升序)
bool myCompare(person &p1,person &p2)
{
if (p1.age == p2.age) {
return p1.high > p2.high;
}
return p1.age < p2.age;
}
void test()
{
person p1("小明", 18, 180);
person p2("小黄", 15, 175);
person p3("小东", 18, 170);
person p4("小伟", 16, 166);
person p5("小爱", 22, 192);
list<person> stk;
stk.push_back(p1);
stk.push_back(p2);
stk.push_back(p3);
stk.push_back(p4);
stk.push_back(p5);
stk.sort(myCompare);
show(stk);
}
int main()
{
test();
system("pause");
return 0;
}