一、list容器
1、基本概念
功能:将数据进行链式存储
链表是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过指针实现的
链表由一系列的节点组成;
节点的组成:一个是存储数据元素的数据域,另一个是存储下一个节点地址的指针域;
STL的链表是一个双向循环链表。
链表list中的迭代器只支持前移或后移,属于双向迭代器。
链表优点:
1)可以对任意的位置进行快速的插入或删除元素。
2)采用动态分配内存,不会造成内存的浪费和溢出
缺点:
1)容器遍历速度没有数组快。
2)占用的空间比数组大
list有一个重要的性质:插入和删除操作都不会造成原有list迭代器失效,这在vector是不成立的。
2、list构造函数
与vector构造函数相同;
如默认构造:
list<T>L;
3、赋值和交换操作
与vector等其他迭代器类似
函数原型:
1)assign(beg,end); //将[beg,end]区间赋值
2)assign(n,elem);
3)重载=运算符
4)swap(lst);//将lst与本身元素互换
4、大小操作
与vector相同;
5、list容器的插入与删除操作
push_back(elem);
pop_back();
push_front(elem);
pop_front();
insert(pos,elem);
insert(pos,n.elem);
insert(pos,beg,end);//在pos位置插入[beg,end) 区间的数据,无返回值
clear();//移除容器所有数据
erase(beg,end);//删除容器[beg,end)区间的数据,返回下一个数据的位置
erase(pos);//删除pos位置的数据,返回下一个数据的位置
remove(elem);//删除容器中所有与elem匹配的值
所有的位置不用索引,而是用迭代器
void test02()
{
//反转和排序
list<int>L;
L.push_back(10);
L.push_back(80);
L.push_back(30);
L.push_back(90);
L.push_back(150);
printL(L); //10 80 30 90 150
L.reverse();
printL(L); //150 90 30 80 10
L.sort(); //所有不支持随机访问的迭代器不能直接用算法库中的sort形式:sort(beg,end);
printL(L);//10 30 80 90 150 默认升序
}
6、数据存取
front(); //返回第一个元素
back();//返回最后一个元素
list在物理上不是连续空间存储的,不能像vector用at()访问某个元素,也不能用[]下标的形式进行访问元素。
L[0] 不可用;L.at(1);也不可用;
list迭代器不支持随机访问;
it++;
it--;//支持双向
it=it+1;//不支持,不支持随机访问
7、list反转和排序
reverse(); //反转
sort(); //排序
8、排序案例
描述:将Person自定义数据类型进行排序,Person属性中有姓名、年龄、身高
排序规则:按照年龄进行升序,如果年龄相同则按身高进行降序
class Person {
public:
string m_name;
int m_age;
int m_height;
Person(string name, int age,int height)
{
this->m_name = name;
this->m_age = age;
this->m_height = height;
}
};
//定义排序规则
bool comparePerson(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;
}
void printLP(list<Person>&L)
{
for (list<Person>::iterator it = L.begin(); it != L.end(); it++)
{
cout << "姓名:"<<(*it).m_name<< " 年龄:"<<(*it).m_age<<" 身高:"<<(*it).m_height<<endl;
}
cout << endl;
}
void test03()
{
//list容器排序案例
list<Person>P;
//准备数据
Person p1("L", 18, 199);
Person p2("I", 16, 177);
Person p3("A", 19, 192);
Person p4("O", 20, 190);
Person p5("C", 20, 167);
Person p6("H", 20, 187);
P.push_back(p1);
P.push_back(p2);
P.push_back(p3);
P.push_back(p4);
P.push_back(p5);
P.push_back(p6);
printLP(P);
cout << "========排序后=======" << endl;
P.sort(comparePerson); //comparePerson为排序规则 为一个bool值
printLP(P);
}
注意:自定义数据类型排序,必须要指定规则。