C++之List容器

1.list容器简介

  list是序列容器,允许在序列中的任何位置执行固定O(1)时间复杂度的插入和删除操作,并在两个方向进行迭代。list容器是一个双向循环链表。

  • list容器与vector容器区别:

   ①list中空间是随机的,通过指针域保存下一个成员地址;vector容器空间是连续的;
   ② list容器数据插入和删除方便,能合理的利用空间;vector容器则是没法实时分配资源;
在这里插入图片描述

2.list容器构造函数

list容器构造函数:
	list< T > p;//默认构造
	list(begin,end);//区间赋值
	list(int num,elem);//num个elem值
	list(const list &p);//拷贝构造
	取头数据:front()
	取尾数据:back();
	互换成员swap();
  • 使用示例:
#include <iostream>
using namespace std;
#include <list>
/*遍历*/
void PrintList(const list<int>& p, int flag)
{
	if (flag == 1)//正向遍历
	{
		cout << "正向遍历:" << endl;
		for (list<int>::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
		{
			cout << *ptr << " ";
		}
	}
	else //逆向遍历
	{
		cout << "逆向遍历:" << endl;
		for (list<int>::const_reverse_iterator ptr = p.rbegin(); ptr != p.rend(); ptr++)
		{
			cout << *ptr << " ";
		}
	}
	cout << endl;
}
void test()
{
	list<int> lst;//默认构造
	//尾插法
	lst.push_back(100);
	lst.push_back(200);
	//头插法
	lst.push_front(300);
	lst.push_front(400);
	PrintList(lst, 1);
	PrintList(lst, 0);
	list<int> lst2(lst.begin(), lst.end());//区间赋值
	cout << "lst2第一个成员:" << lst2.front() << endl;
	cout << "lst2最后一个成员:" << lst2.back() << endl;
	cout << "\tlst3" << endl;
	list<int> lst3(3, 666);//3个666
	PrintList(lst3, 1);
	list<int> lst4(lst2);//拷贝构造
}
int main()
{
	test();
	system("pause");
}

在这里插入图片描述

3.list容器赋值与互换成员

list容器赋值:
	重载运算符=: list& operator=(const list &p);
	siggn(int num,elem);//num个elem
	siggn(begin,end);//区间赋值
互换:
	swap(list &p);
  • 使用示例:
#include <iostream>
using namespace std;
#include <list>
void PrintList(const list<int>& p)
{
	for (list<int>::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout << *ptr << " ";
	}
	cout << endl;
}
void test()
{
	list<int> lst;
	for (int i = 10; i <= 30; i += 10)
	{
		lst.push_back(i);
	}
	list<int> lst2 = lst;//直接赋值
	cout << "lst2:" << endl;
	PrintList(lst2);
	list<int> lst3;
	lst3.assign(5, 666);
	cout << "lst3:" << endl;
	PrintList(lst3);
	list<int> lst4;
	lst4.assign(lst3.begin(), lst3.end());//区间赋值
	cout << "lst4:" << endl;
	PrintList(lst4);
	
	//互换元素
	lst4.swap(lst);
	cout << "lst4:" << endl;
	PrintList(lst4);
	cout << "lst:" << endl;
	PrintList(lst);
}
int main()
{
	test();
	system("pause");
}

在这里插入图片描述

4.list容器设置和获取大小

   list容器也有获取元素个数函数size()和设置元素个数函数resize(),但list容器不存在获取容量capacity()。
   检查容器是否为空可以使用empty()函数。

list容器元素个数:size()
指定元素个数:resize(int num);
			 resize(int num,elem); 指定大小,超出用elem补齐
判断容器是否为空:empty()
  • 使用示例:
#include <iostream>
using namespace std;
#include <list>
void PrintList(const list<string>& p)
{
	for (list<string>::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout << *ptr << " ";
	}
	cout << endl;
}
void test()
{
	list<string> lst;
	//插入数据
	lst.push_back("C++");
	lst.push_back("list容器");
	lst.push_back("学习");
	lst.push_back("示例");
	PrintList(lst);
	cout << "list成员个数:" << lst.size() << endl;
	lst.resize(10, "c++");//指定大小
	PrintList(lst);
	cout << "list成员个数:" << lst.size() << endl;
	lst.resize(2, "c++");//指定大小
	PrintList(lst);
	cout << "list成员个数:" << lst.size() << endl;

	list<string> lst2;
	if (lst2.empty())
	{
		cout << "lst2容器为空" << endl;
	}

}
int main()
{
	test();
	system("pause");
}

在这里插入图片描述

5.list容器插入与删除

   list容器中插入与删除相关函数如下所示:

list插入:
	push_back();尾插
	push_front();//头插入
	insert(iterator pos,elem);//在指定位置插入elem
	insert(iterator pos,n,elem);//在指定位置插入n个elem
	insert(iterator pos,begin,endl);在指定位置插入一个区间
list删除:
	pop_back();//尾删
	pop_front();//头删除
	erase(iterator pos);//删除指定位置的内容
	erase(begin,end);//删除区间内容
	clear();//删除所有内容
	remov(elem);删除容器中所有的elem

  • 使用示例:
#include <iostream>
using namespace std;
#include <list>
class Person
{
public:
	Person(string name, int age) :name(name), age(age) {

	}
	bool operator==(const Person &p);
	string name;
	int age;
};
ostream& operator<<(ostream& cout, Person p)
{
	cout << "姓名:" << p.name << "\t年龄:" << p.age ;
	return cout;
}
bool Person::operator==(const Person &p)
{
	if (this->age == p.age && this->name == p.name)return true;
	return false;
}
void PrintList(list<Person>& p)
{
	for (list<Person>::iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout << *ptr << endl;
	}
}
void test()
{
	Person p1("小王",18);
	Person p2("小李", 18);
	Person p3("小刘", 18);
	Person p4("小林", 18);
	Person p5("小郭", 18);
	list<Person> lst;
	lst.push_back(p1);
	lst.push_back(p2);
	lst.push_back(p3);
	lst.push_back(p4);
	lst.push_back(p5);
	if (p1 == p1)
	{
		cout << "相等" << endl;
	}
	cout << "lst成员信息:" << endl;
	PrintList(lst);
	list<Person>::iterator ptr = lst.begin();
	ptr++;
	lst.insert(ptr, Person("it_阿水", 18));//从第一个位置插入数据
	cout << "insert插入成员信息:" << endl;
	PrintList(lst);

	list<Person> lst2;
	lst2.insert(lst2.begin(),lst.begin(), lst.end());//从头插入区间数据
	cout << "insert插入区间信息:" << endl;
	PrintList(lst2);
	ptr = lst2.begin();
	for (int i = 0; i < 3; i++)ptr++;
	lst2.insert(ptr, 3, p1);//指定位置插入3个成员
	cout << "insert插入多个成员信息:" << endl;
	PrintList(lst2);
	cout << "list2元素个数:" << lst2.size() << endl;
	lst2.erase(lst2.begin());//删除第一个位置的成员
	lst2.pop_back();//删除最后一个成员
	cout << "list2元素个数:" << lst2.size() << endl;
	PrintList(lst2);
	//lst2.remove(p1); 


	list<int>lst3;
	lst3.push_back(10);
	lst3.push_back(10);
	lst3.push_back(3);
	lst3.push_back(10);
	lst3.push_back(3);
	lst3.remove(10);//删除所有的10
	for (list<int>::iterator ptr = lst3.begin(); ptr != lst3.end(); ptr++)
	{
		cout << *ptr << " ";
	}
	cout << endl;
}
int main()
{
	test();
	system("pause");
}

在这里插入图片描述

6.list容器数据存取

   由于list容器底层是通过双向循环链表来实现的,成员空间都是通过指针域保存的,所以不支持[]和at()访问成员。
   list容器的迭代器不支持随机访问。

list容器数据存取:
	back();//获取最后一个元素
	push_back();//从末尾插入
	front();//获取第一个元素
	push_front();从头插入
注意:由于list容器并不是一段连续的空间,所以不支持[]at()访问成员
	  list容器的迭代器不支持随机访问,但是双向的
  • 使用示例:
#include <iostream>
using namespace std;
#include <list>
void test()
{ 
	list<int> lst;
	//插入数据
	lst.push_back(10);
	lst.push_front(20);
	lst.push_back(30);
	cout << "第一个元素:" << lst.front() << endl;
	cout << "最后一个元素:" << lst.back() << endl;
	list<int>::iterator ptr = lst.begin();
	ptr++;//支持往后
	ptr--;//支持往前
	//ptr += 3;错误,不支持随机访问

}
int main()
{
	test();
	system("pause");
}

在这里插入图片描述

7.list容器数据反转与排序

   list容器自带排序函数sort(),默认是升序排序。


list容器反转:
	reverse();//反转(逆序)
list容器排序
	sort();//成员函数
注意:所有不支持迭代器随机访问的容器都不能使用全局函数sort进行排序,一般该容器会自带排序的成员函数

  • 使用示例:
#include <iostream>
using namespace std;
#include <list>
void PrintList(list<int>& p)
{
	for (list<int>::iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout << *ptr << " ";
	}
	cout << endl;
}
bool mycompare(int v1, int v2)
{
	return v1 > v2;
}
void test()
{
	list<int> lst;
	lst.push_back(10);
	lst.push_back(30);
	lst.push_back(20);
	lst.push_front(40);
	lst.push_front(60);
	lst.push_front(50);
	PrintList(lst);
	//反转
	lst.reverse();
	cout << "lst反转后" << endl;
	PrintList(lst);
	//排序
	lst.sort();//默认是升序
	cout << "从小到大排序:" << endl;
	PrintList(lst);
	//降序排序
	lst.sort(mycompare);
	cout << "从大到小排序:" << endl;
	PrintList(lst);
}
int main()
{
	test();
	system("pause");
}

8.list容器自定义数据类型排序案例

   Person数据保存每个用户的姓名、年龄、身高,现在需要对年龄按升序排序,若年龄相同,则对按身高进行降序排序。

#include <iostream>
using namespace std;
#include <list>
class Person
{
public:
	Person(string name, int age, int height) :name(name), age(age), height(height) {
	}
	string name;//姓名
	int  age;//年龄
	int height;//身高
};
ostream& operator<<(ostream& cout, Person p)
{
	cout << "姓名:" << p.name << "\t年龄:" << p.age << "\t身高:" << p.height;
	return cout;
}
void PrintList(list<Person>& p)
{
	for (list<Person>::iterator ptr = p.begin(); ptr != p.end(); ptr++)
	{
		cout << *ptr << endl;
	}
}
/*
按照年龄升序排序,年龄相同时按升高降序排序
*/
bool PersonCompare(Person& p1, Person& p2)
{
	if (p1.age == p2.age)
	{
		return p1.height > p2.height;
	}
	return p1.age < p2.age;
}
void test()
{
	list<Person> lst;
	lst.push_back(Person("小王", 18, 170));
	lst.push_back(Person("小刘", 18, 175));
	lst.push_back(Person("小李", 23, 168));
	lst.push_back(Person("小林", 20, 171));
	lst.push_back(Person("小蒋", 18, 172));
	lst.push_back(Person("小姜", 17, 176));
	PrintList(lst);
	cout << "排序后:" << endl;
	lst.sort(PersonCompare);
	PrintList(lst);

}
int main()
{
	test();
	system("pause");
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/124781.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】类和对象的关系,对象的存储方式以及对象内存的计算

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Window10安装Docker

文章目录 Window10安装Docker前提条件Hyper -VWSL 2.0 安装包下载执行安装包更新 Window10安装Docker 前提条件 Hyper -V 如何启用 WSL 2.0 安装包下载 官网地址 下载后&#xff1a; 执行安装包 wsl --update等得有点久 重新打开 拉取一个helloworld镜像 说明已经…

【CocosCreator】利用遮罩Mask实现单边开门效果

如果对前端八股文感兴趣&#xff0c;可以留意公重号&#xff1a;码农补给站&#xff0c;总有你要的干货。 实现思路 首先新建一个新的遮罩节点&#xff08;全部采用默认属性&#xff09;&#xff0c;将其大小设为门的大小&#xff0c;然后将其摆放到门所在的位置&#xff0c;如…

MATLAB_5MW风电永磁直驱发电机-1200V直流并网MATLAB仿真模型

仿真软件&#xff1a;matlab2016b 风机传动模块、PMSG模块、蓄电池模块、超级电容模块、无穷大电源、蓄电池控制、风机控制、逆变器控制等模块。 逆变器输出电压&#xff1a; 混合储能系统SOC&#xff1a; 威♥关注“电击小子程高兴的MATLAB小屋”获取更多精彩资料&#xff0…

单调栈【2023年最新】

做题的时候看到了单调栈&#xff0c;但是不知道是个什么玩意&#xff0c;记录一下吧。 单调栈含义 单调栈是一种特殊的数据结构&#xff0c;用于解决一些与单调性相关的问题。它的基本含义是在栈的基础上&#xff0c;维护一个单调递增或单调递减的栈。 在单调递增栈中&#…

SpringCloud-Gateway无法使用Feign服务(2021.X版本)

Spring Cloud Gateway 2021.x版本&#xff0c;无法使用Feign调用其他服务接口。 问题原因&#xff1a; 在官网的 issue 里面找到了相关的问题。 How to call another micro-service on GatewayFilterFactory ? Issue #1090 spring-cloud/spring-cloud-gateway GitHubHel…

QT QSplitter

分裂器QSplitter类提供了一个分裂器部件。和QBoxLayout类似&#xff0c;可以完成布局管理器的功能,但是包含在它里面的部件,默认是可以随着分裂器的大小变化而变化的。 比如一个按钮放在布局管理器中,它的垂直方向默认是不会被拉伸的,但是放到分裂器中就可以被拉伸。还有一点不…

OV5640的参数与配置方法

分辨率和速率&#xff08;FPS&#xff09; 寄存器配置 I/O 板的驱动能力和方向控制 system clock control OV5640 PLL 允许输入时钟频率范围为 6~27 MHz&#xff0c;最大 VCO 频率为 800 MHz。 MipiClk 用于 MIPI&#xff0c;SysClk 用于图像信号处理 (ISP) 模块的内部时钟。 …

TensorFlow(1):深度学习的介绍

1 深度学习与机器学习的区别 学习目标&#xff1a;知道深度学习与机器学习的区别 区别&#xff1a;深度学习没有特征提取 1.1 特征提取方面 机器学习的特征工程步骤是要靠手动完成的&#xff0c;而且需要大量领域专业知识深度学习通常由多个层组成&#xff0c;它们通常将更简…

Redis系列之实现分布式自增主键

软件环境 JDK 1.8 SpringBoot 2.2.1 Maven 3.2 Mysql 8.0.26 redis 6.2.14 Mybatis Plus 3.4.3.4 开发工具 IntelliJ IDEA smartGit 一、实现原理 使用Redis来实现分布式的主键自增主要是依赖于Redis的INCR命令&#xff0c;调用INCR命令的对应key&#xff0c;其数值…

centos7部署Canal与Canal集成使用

1、简介 canal [kə’nl]&#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署&#xff0c;存在跨机房同步的业务需求&#xff0c;实现方式主要是基于业务 trigge…

Flink架构

1、Apache Flink集群的核心架构&#xff1a; 1、client&#xff08;作业客户端&#xff09;&#xff1a;提交任务的地方叫做客户端 2、JobManager&#xff08;作业管理器&#xff09;&#xff1a;作用是用于管理集群中任务 3、TaskManager&#xff08;任务管理器&#xff09;&a…

k8s 1.28安装

容器运行时&#xff0c;containerd 按照官方的指导&#xff0c;需要安装runc和cni插件&#xff0c;提示的安装方式&#xff0c;有三种&#xff1a; 二进制安装包源码apt-get 或 dnf安装 我们这里选用第三种&#xff0c;找到docker官方提供的安装方式 ubuntu-containerd # A…

Elasticsearch:使用你的 RAG 来进行聊天

什么是人工智能中的检索增强生成&#xff08;RAG&#xff09;&#xff1f; 检索增强生成 (RAG)&#xff0c;与你的文档聊天的超级英雄&#xff0c;架起信息检索和文本生成世界的桥梁&#xff01; 这就像福尔摩斯和莎士比亚联手解决需要大量知识的复杂任务。 RAG 突然介入&…

网络编程套接字(3)——协议定制 | 序列化与反序列化

文章目录 一.认识“协议”1.协议的概念2.结构化数据的传输3.序列化和反序列化 二. 网络版计算器1.服务端2.协议定制(1) 网络发送和读取的正确理解(2) 协议定制的问题 3.客户端4.代码 三.Json实现序列化反序列化1.简单介绍2.使用 一.认识“协议” 1.协议的概念 协议&#xff0c…

Pytest插件

官方文档&#xff1a;API Reference — pytest documentation BaseReport 定义Case结果输出 >>> from _pytest.reports import TestReport >>> test TestReport(1,1,1,pass,,running) >>> print(dir(test)) [__annotations__, __class__, __delatt…

02-MySQL-基础-增删改查

一、DDL 定义数据库对象&#xff08;数据库&#xff0c;表&#xff0c;字段&#xff09; ①&#xff1a;数据库操作 01. 查询 1. 查询所有数据库 show databases;2. 查询当前使用的数据库 SELECT database();02. 使用 USE sys;03. 创建 CREATE DATABASE [IF NOT EXISTS]数据…

自动化测试(Java+eclipse)教程

webdriver环境配置 1.下载chromedriver到本地&#xff08;一定要选择和自己浏览器相对应的版本chromedriver下载地址&#xff09; 2.加入到环境变量path中 webdriver工作原理 创建web自动化测试脚本 1.Maven项目创建 File->New->project->(搜索maven)选择maven pr…

JavaScript客户端操作

BOM(browser object model)是浏览器对象模型的简称&#xff0c;被广泛应用于Web开发中&#xff0c;主要用于对客户端浏览器的管理。BOM的概念比较古老&#xff0c;但是一直没有被标准化&#xff0c;不过各主流浏览器均支持BOM&#xff0c;都遵守最基本的规则和用法&#xff0c;…

Dcoker学习笔记(一)

Dcoker学习笔记一 一、 初识Docker1.1 简介1.2 虚拟机和docker的区别1.3 Docker架构1.4 安装Docker&#xff08;Linux&#xff09; 二、 Dcoker基本操作2.1 镜像操作2.2 容器操作练习 2.3 数据卷volume&#xff08;容器数据管理&#xff09;简介数据卷语法数据卷挂载 2.4 自定义…