将数据进行链式存储
list是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的
是一种双向链表的容器,用于存储和管理元素的集合,
链表的组成:链表由一系列的结点组成
因为内存空间不是随机的,故list中的迭代器只支持前移和后移,属于双向迭代器
list的优点:
-
采用动态内存分配,不会造成内存浪费和溢出
-
执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
-
这个特点同时也导致了进行插入和删除操作不会导致list迭代器的失效(节点之间的链接关系并不依赖于内存块的连续性,因此在std::list中进行插入或删除不会导致迭代器的失效,可以继续用它们来遍历和访问列表中的元素。
-
缺点:
-
链表灵活,但是空间和时间额外耗费比较大
-
不支持随机访问(元素不是随机存储)
构造函数
-
list<T> lst;
//list采用采用模板类实现,对象的默认构造形式: -
list(beg,end);
//构造函数将[beg, end)区间中的元素拷贝给本身。 -
list(n,elem);
//构造函数将n个elem拷贝给本身。 -
list(const list &lst);
//拷贝构造函数。
赋值与交换
-
assign(beg, end);
//将[beg, end)区间中的数据拷贝赋值给本身。 -
assign(n, elem);
//将n个elem拷贝赋值给本身。 -
list& operator=(const list &lst);
//重载等号操作符 -
swap(lst);
//将lst与本身的元素互换。
大小操作
-
size();
//返回容器中元素的个数 -
empty();
//判断容器是否为空 -
resize(num);
//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。//如果容器变短,则末尾超出容器长度的元素被删除。
-
resize(num, elem);
//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。//如果容器变短,则末尾超出容器长度的元素被删除。
插入和删除
-
push_back(ele);
//在容器尾部插入一个元素 -
pop_back();
//删除容器最后一个元素 -
push_front();
//在容器开头插入一个元素 -
pop_front();
//在容器开头移除一个元素 -
insert(pos,ele);
//在pos位置插ele元素的拷贝,返回数据的位置 -
insert(pos,n,ele);
//在pos位置插入n个ele数据,无返回值 -
insert(pos,beg,end);
//在pos位置插入[beg,end)区间的数据,无返回值。 -
clear();
//移除容器中所有数据 -
erase(beg,end);
//删除[beg,end)区间数据,返回下一个数据的位置 -
erase(pos);
//删除pos位置的数据,返回下一个数据的位置。 -
remove(elem);
//删除容器中所有与elem值匹配的元素。
数据存取
-
front();
//返回第一个元素 -
back();
//返回最后一个元素
注意,没有at或者下标因为不是连续存储
反转和排序
-
reverse();
//反转链表 -
sort();
//链表排序 已有数据类型默认排序规则比较按照operator<进行比较//若是自定义数据类型,可以在自定义数据类型中重载比较运算符
//或者提供自定义比较函数然后在sort()中传入这个函数
例如:
bool ComparePerson(const Person& p1, const Person& p2) {
if (p1.m_Age == p2.m_Age) {
return p1.m_Height > p2.m_Height; //再按身高从大到小
}
else
{
return p1.m_Age < p2.m_Age; //先按年龄从小到大排序
}
}