list基本概念
功能:将数据进行链式存储
链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的
链表的组成:链表由一系列结点组成
结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域
STL中的链表是一个双向循环链表
注意:由于链表的存储方式并不是连续的内存空间,因此链表list中的迭代器只支持前移和后移,属于双向迭代器
list的优点:
采用动态存储分配,不会造成内存浪费和溢出 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
list的缺点: 链表灵活,但是空间(指针域) 和 时间(遍历)额外耗费较大
List有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。
总结:STL中List和vector是两个常被使用的容器,各有优缺点
list构造函数
功能描述:
创建list容器
函数原型
list<T> lst; //list采用采用模板类实现,对象的默认构造形式:
list(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。
list(n,elem); //构造函数将n个elem拷贝给本身。
list(const list &lst); //拷贝构造函数
list 赋值和交换
功能描述:
给list容器进行赋值,以及交换list容器
函数原型:
assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem); //将n个elem拷贝赋值给本身。
list& operator=(const list &lst); //重载等号操作符
swap(lst); //将lst与本身的元素互换。
list 大小操作
功能描述:
对list容器的大小进行操作
函数原型:
size(); //返回容器中元素的个数
empty(); //判断容器是否为空
resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。
//如果容器变短,则末尾超出容器长度的元素被删除。
resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。
//如果容器变短,则末尾超出容器长度的元素被删除。
list 插入和删除
功能描述:
对list容器进行数据的插入和删除
函数原型
push_back(elem); //在容器尾部加入一个元素
pop_back(); //删除容器中后一个元素
push_front(elem); //在容器开头插入一个元素
pop_front(); //从容器开头移除第一个元素
insert(pos,elem); //在pos位置插elem元素的拷贝,返回新数据的位置
insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值。
clear(); //移除容器的所有数据
erase(beg,end); //删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos); //删除pos位置的数据,返回下一个数据的位置。
remove(elem); //删除容器中所有与elem值匹配的元素。
list 数据存取
功能描述:
对list容器中数据进行存取
函数原型
front(); //返回第一个元素。
back(); //返回后一个元素。
注意:list容器的迭代器是双向迭代器,不支持随机访问,不可以通过[]或者at方式访问数据
list 反转和排序
功能描述:
将容器中的元素反转,以及将容器中的数据进行排序
函数原型
reverse(); //反转链表
sort(); //链表排序
排序案例
案例描述:
将Person自定义数据类型进行排序,Person中属性有姓名、年龄、身高
排序规则:按照年龄进行升序,如果年龄相同按照身高进行降序
#include <iostream>
#include <list>
#include <string>
/*
案例描述:将Person自定义数据类型进行排序,Person中属性有姓名、年龄、身高
排序规则:按照年龄进行升序,如果年龄相同按照身高进行降序
*/
class Person //类
{
public:
Person(std::string name,int age = 18,int high = 170)
:m_name(name),m_age(age),m_high(high)
{}
std::string getName()
{
return m_name;
}
int getAge()
{
return m_age;
}
int getHigh()
{
return m_high;
}
private:
std::string m_name;
int m_age;
int m_high;
};
void createPerson(std::list<Person> &L) //创建对象
{
Person p1("刘备", 35 , 175);
Person p2("曹操", 45 , 180);
Person p3("孙权", 40 , 170);
Person p4("赵云", 25 , 190);
Person p5("张飞", 35 , 160);
Person p6("关羽", 35 , 200);
L.push_back(p1);
L.push_back(p2);
L.push_back(p3);
L.push_back(p4);
L.push_back(p5);
L.push_back(p6);
}
bool myCompare(Person &p1,Person &p2) //定义排序规则
{
if(p1.getAge()==p2.getAge())
{
return p1.getHigh()>p2.getHigh();
}
else
{
return p1.getAge()<p2.getAge();
}
}
void sort_Person(std::list<Person> &L) //排序
{
L.sort(myCompare);
}
void printList(std::list<Person> &L) //打印
{
for(std::list<Person>::iterator it = L.begin();it!=L.end();it++)
{
std::cout << "name: " << it->getName() << " " << "age: " << it->getAge() << " "
<< "high: " << it->getHigh() << std::endl;
}
}
int main()
{
std::list<Person> L;
createPerson(L); //创建对象
sort_Person(L); //排序
printList(L); //打印
return 0;
}