STL常用容器之 list

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;	
} 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值