STL常用容器之 list
文章目录
1. list容器
1. list容器的基本概念
功能:将数据进行链式存储
链表(list)是一种物理存储单元上非连续存储结构,数据元素的逻辑顺序是通过链表中的指针连接进行实现的
链表的组成:链表由一堆结点组成
节点的组成:数据域与指针域
STL中链表是一个双向循环链表
由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移跟后移,属于双向迭代器
list的优点:
- 采用动态存储分配,不会造成内存浪费和溢出
- 链表执行插入和删除操作十分简单,修改指针即可,不需要大量移动元素
list缺点:
- 链表灵活,但空间(指针域)和时间(遍历)额外消耗较大
List有一个重要的性质,插入操作和删除都不会造成原有list迭代器的失效,这在vector中不成立
总结:STL中List和vector是两个最常使用的容器,各有优缺点
2. list 构造函数
函数原型:
list<T> lst;//模板类实现,默认构造
list(beg,end);//区间内拷贝给本身
list(n,elem);//n个elem元素拷贝给本身
list(const list& lst);//拷贝构造
3. list 赋值和交换
函数原型:
assign(beg,end);//区间内拷贝给本身
assign(n,elem);//n个elem拷贝给本身
list& operator=(const list &lst);//重载等号
swap(lst);//元素交换
4. list 大小操作
函数原型:
size();//大小
empty();//是否为空
resize(num);//修改大小 多了抹除,少了默认填充
resize(num,elem);//默认值为elem
5. list 插入和删除
函数原型:
push_back(elem);
pop_back(elem);
push_front(elem);
pop_front(elem);
insert(pos,elem);//pos位置插入elem,返回新数据的位置
insert(pos,n,elem);//pos位置插入n个elem,无返回值
insert(pos,beg,end);//pos位置插入区间内元素,无返回值
clear();
erase(beg,end);//删除区间内数据
erase(pos);//删除pos位置数据,返回下一个数据位置
remove(elem);//删除所以elem元素
6. list 数据存取
函数原型:
front();//返回第一个元素
back();//返回最后一个元素
7. list 反转和排序
reverse();//反转链表
sort();//链表排序 (成员函数)默认从小到大
//从大到小
bool myCompare(int v1, int v2)
{
return v1 > v2;
}
lst.sort(myCompare);
8. 排序案例
将Person自定义数据类型进行排序,Person中有姓名,年龄,身高
排序规则:年龄升序,如果年龄相同在按照身高进行降序。
源码:https://blog.youkuaiyun.com/weixin_50901683/article/details/113981902
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
class Person
{
public:
Person(string name,int age,int height):m_Name(name),m_Age(age),m_Height(height){}
string m_Name;//姓名
int m_Age;//年龄
int m_Height;//身高
};
//指定排序规则
bool comparePerson(Person& p1, Person& p2)
{
//按照年龄 升序
if(p1.m_Age == p2.m_Age)
{
//按照身高降序
return p1.m_Height > p2.m_Height;
}
else
{
return p1.m_Age < p2.m_Age;
}
}
void test()
{
list<Person>L;//创建容器
//准备数据
Person p1("小一",27,160);
Person p2("小二",25,192);
Person p3("小三",18,188);
Person p4("小四",11,178);
Person p5("小五",18,148);
Person p6("小六",18,159);
//插入数据
L.push_back(p1);
L.push_back(p2);
L.push_back(p3);
L.push_back(p4);
L.push_back(p5);
L.push_back(p6);
//打印
cout << "排序前" << endl;
for(list<Person>::iterator it = L.begin(); it != L.end(); it++)
{
cout << "姓名: " << (*it).m_Name << " 年龄:" << it->m_Age << " 身高: " << it->m_Height << endl;
}
cout << "排序后" << endl;
L.sort(comparePerson);
for(list<Person>::iterator it = L.begin(); it != L.end(); it++)
{
cout << "姓名: " << (*it).m_Name << " 年龄:" << it->m_Age << " 身高: " << it->m_Height << endl;
}
}
int main()
{
test();
system("pause");
return 0;
}