C++STL之vector与list

news2024/11/25 7:32:30

文章目录

  • 关于vector的用法
  • 关于List的用法
  • vector和list的区别

关于vector的用法

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;

class PtrInt
{
	int* ptr;
public:
	PtrInt(int x = 0) :ptr(new int[x])
	{
		cout << "Create PtrInt:" << endl;
	}
	PtrInt(const PtrInt& pt) :ptr(new int())
	{
		if (pt.ptr!=nullptr)
		{
			*ptr = *pt.ptr;
		}
		cout << "Copy Create:" << endl;
	}
	PtrInt& operator=(const PtrInt& pt)
	{
		if (this != &pt)
		{
			delete ptr;
			ptr = new int();
			if (pt.ptr != nullptr)
			{
				*ptr = *pt.ptr;
			}
			cout << "operator=()" << endl;
		}
	}
	PtrInt(PtrInt&& pt) :ptr(pt.ptr)
	{
		pt.ptr = nullptr;
		cout << "move create" << endl;
	}
	PtrInt& operator=(PtrInt&& pt)
	{
		if (this != &pt)
		{
			delete ptr;
			ptr = pt.ptr;
			pt.ptr = nullptr;
		}
		cout << "move operator=()" << endl;
	}
	~PtrInt()
	{
		delete ptr;
		ptr = nullptr;
		cout << "Destory PtrInt" << endl;
	}
	void Print()const
	{
		if (ptr != nullptr)
		{
			cout << *ptr << endl;
		}
	}
	void SetValue(int x)
	{
		if (ptr = nullptr)
		{
			*ptr = x;
		}
		else
		{
			ptr = new int(x);
		}
	}
	int GetValue()const
	{
		if (ptr != nullptr)
		{
			return *ptr;
		}
		else
		{
			return -1;
		}
	}
};

int main()
{
	std::vector<PtrInt>ar;
	for (int i = 0; i < 20; ++i)
	{
		ar.push_back(PtrInt(i));//构建无名对象
		cout << "Size:" << ar.size() << endl;;
		cout << "capacity" << ar.capacity() << endl;
	}
}

#if 0
class Int
{
private:
	int value;
public:
	Int(int x=0):value(x){}
	~Int(){}
};

int main()
{
	std::vector<int>iar = {12,23,34,45,56,67,78,89};
	std::vector<double>dar;
	std::vector<int*>par;//最好不要存放指针,因为new开辟空间,一定不要忘记析构
	std::vector<int>::reverse_iterator rit = iar.rbegin(); //逆向迭代器

	int n = iar.size();
	int* p = iar.data();
}
#endif

运行结果分析:
在这里插入图片描述

容量按照1.5倍增加,容量增容意味着要不断的创建空间,并且不断调用移动构造函数,和不断将对象析构,效率太低,可以直接调用reserve

int main()
{
	std::vector<PtrInt>ar;
	ar.reserve(200); //先预留200个空间,效率提高,只申请空间,不创建对象
	ar.resize(200); //改变存储元素的个数,直接创建200个对象,并且容量为200
	for (int i = 0; i < 20; ++i)
	{
		ar.push_back(PtrInt(i));//构建无名对象
		cout << "Size:" << ar.size() << endl;;
		cout << "capacity" << ar.capacity() << endl;
	}
}

迭代器失效,指针指向的对象已经被释放掉

int main()
{
	std::vector<PtrInt>ar;
	ar.push_back(PtrInt(1));
	ar.push_back(PtrInt(2)); 
	ar.push_back(PtrInt(3));
	ar.push_back(PtrInt(4));
	ar.push_back(PtrInt(5));

	std::vector<PtrInt>::iterator it = ar.begin();
	ar.insert(it, PtrInt(6));  //调用移动赋值函数

	for (auto x: ar)
	{
		x.Print();
	}
	ar.pop_back();
	ar.erase(it); //迭代器失效,迭代器面向对象的指针
}

vector作为数组,如何使效率变高?(提前获取vector的大小,预留好空间)

关于List的用法

在相同的空间中,vector的存储密度比List的存储密度大

int main()
{
	std::list<PtrInt>arlist;
	for (int i = 0; i < 5; i++)
	{
		//arlist.push_back(PtrInt(i));
		arlist.emplace_back(i);
	}

	for (auto& x : arlist)  //尽量使用引用,因为使用引用不需要调动拷贝构造
	{
		x.Print();
	}
}

出现内存泄漏的情况

int main()
{
	std::list<PtrInt*>arlist;
	for (int i = 0; i < 5; ++i)
	{
		arlist.push_back(new PtrInt(i));
	}
	for (auto& x : arlist)
	{
		x->Print();  //无法调用析构函数去析构PtrInt
	}
	return 0;
}

在这里插入图片描述

解决方案(智能指针)

int main()
{
	std::list<std::unique_ptr<PtrInt>>arlist;
	for (int i = 0; i < 10; ++i)
	{
		arlist.push_back(std::unique_ptr<PtrInt>(new PtrInt(i))); //智能指针,防止内存泄漏
	}
	for (auto& x : arlist)
	{
		x->Print();
	}
	return 0;
}

在这里插入图片描述
List的排序算法(当排序量较少是,一般采用快排)

vector和list的区别

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
关于迭代器失效
在这里插入图片描述
如果需要高效的随机存取,选择vector(深入理解计算机系统1,6,9章)
场景题目一:页面置换算法,如何设计一个页面置换算法
场景题目二:刷视频,如何让视频刷的更快(生产者消费者模型)
在这里插入图片描述
关于vector里面存放指针的情况
在这里插入图片描述

补充点:关于push_back和emplace_back的区别
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

海外跨境电商商城源码-进出口电商平台网站-多语言多商户平台

欢迎探讨&#xff0c;名片交流 一、海外跨境电商系统源码包括以下几个部分&#xff1a; 前端&#xff1a;React框架、Bootstrap 后端&#xff1a;Node.js&#xff0c;Express框架、NoSQL数据库 支付系统&#xff1a;Stripe、PayPal等主流支付平台 物流系统&#xff1a;DHL…

idea 打开项目代码出错,但是编译没问题

一、说明 在使用idea的时候发现有时候编译没问题&#xff0c;代码没问题&#xff0c;但是就是项目报红&#xff1b;然后就找了一下解决方法&#xff0c;总结一下然后发一下博客给说明一下吧 二、问题和说明 1.问题 经常出现在pom的引入版本升级和版本依赖有修改 2.解决 2.…

Benewake(北醒) 单点TF系列雷达【通用指令串口助手】使用说明

目录 硬件准备1:连接设备2:串口连接以及读数 常见问题1 连接串口后无数据 硬件准备 1:连接设备 连接『TF系列产品』、『TTL - USB 转接板』和『USB 线』&#xff0c;确保无松动&#xff0c;再将『USB 线』与『电脑』连接。 2:串口连接以及读数 1.打开串口助手&#xff0c;选…

Zabbix 5.0如何升级至6.0?操作文档

Zabbix5.0升级至6.0的认证培训&#xff0c;仅需6小时&#xff08;无需5天&#xff09;点击报名。 感谢本文作者王会新&#xff0c;ZCP-Zabbix高级认证工程师 目录 1.方案说明 2.环境说明 3.Mysql环境部署 3.1 mysql安装 3.2 配置mysql 3.3 创建zabbix库 4.Zabbix Server升…

国产GPU重要应用场景迎来突破!摩尔线程发布重磅产品与创新解决方案

5月31日&#xff0c;摩尔线程举办2023夏季发布会&#xff0c;重磅宣布了一系列新产品与技术更新&#xff0c;涵盖数字办公、娱乐与创作、AI与云计算以及元宇宙等GPU重要应用场景&#xff0c;标志着摩尔线程为用户提供的高品质、易部署、创新性应用型解决方案取得重大进展。 主…

JetBrains的PHP集成开发环境PhpStorm 2023版本在Linux系统的下载与安装配置教程

目录 前言一、PhpStorm安装二、使用配置总结 前言 PhpStorm是一款专为PHP开发人员设计的集成开发环境&#xff08;IDE&#xff09;。它提供了丰富的功能和工具&#xff0c;可以帮助开发人员更高效地编写、调试和部署PHP应用程序。注&#xff1a;已在CentOS7.9和Ubuntu20.04安装…

【开发心得】一招减少msdtc时间3分钟,但还有未解之谜

最近解决了一个诡异的问题&#xff0c;MSDTC默认超时造成事务被取消&#xff0c;业务被迫中断&#xff0c;好在没有一直跟MSDTC耗着&#xff0c;而是通过其他方式解决了&#xff0c;但最后还是留下了两个未解之谜。对用到MSDTC处理SQL事务的朋友应该有借鉴作用&#xff0c;欢迎…

uniapp滚动加载 下拉刷新

前言 在日常开发中&#xff0c;滚动加载和下拉刷新是非常常见的功能&#xff0c;页面数据过多时&#xff0c;需要滚动加载优化性能&#xff0c;本篇技术分享博客将介绍如何在uniapp中实现滚动加载和下拉刷新。 预览 滚动加载 下拉刷新 一、滚动加载 滚动加载指的是当用户滑…

LINUX系统编程-----上

文章目录 第一章 linux系统介绍(属于扯闲篇)linux的概况linux的历史起源unixPosix标准和其他标准开源运动linux的诞生 linux使用使用范围linux的登录 第二章 linux常用命令linux的shell使用切换用户显示所有用户退出当前用户添加用户 删除用户当前工作目录当前工作目录下的所有…

chatgpt赋能python:Python交换位置:如何快速交换列表中的元素

Python交换位置&#xff1a;如何快速交换列表中的元素 介绍 Python作为一种强大且易于学习的编程语言&#xff0c;一直受到广大开发者的喜爱和选择。而在Python编程中&#xff0c;往往需要对列表中的元素进行交换操作。那么&#xff0c;在本文中&#xff0c;我们将探讨Python…

u-boot启动流程分析-史上最全最详细

嗨喽&#xff0c;大家好&#xff0c;我是程序猿老王&#xff0c;程序猿老王就是我。 今天给大家全面的分析一下u-boot启动流程。整理这篇文章花费时间较长&#xff0c;中间很长时间未更新&#xff0c;希望这篇文章对大家有所帮助。 本章主要是详细的分析一下uboot的启动流程&am…

摆脱低工资!80%的高薪人会的动态大屏技巧,工具和教程都给你!

在汇报上下功夫已经是职业人基本的素养&#xff0c;看了某鹅厂的产品组朋友做的汇报才知道他们已经卷到了这种程度&#xff01;把静态的图表和文字&#xff0c;图片做成了3D动画&#xff0c;你别说&#xff0c;真就很出彩&#xff01;既有产品的仿真&#xff0c;又有数据的支撑…

Python编程技巧

当涉及到Python编程时&#xff0c;以下是一些技巧和惯用法&#xff0c;可以帮助您编写更加高效、可维护和优雅的代码&#xff1a; 1.使用描述性的变量名&#xff1a;选择具有描述性的变量和函数名&#xff0c;以便于理解代码的含义。避免使用单个字母或无意义的名称。 2.编写清…

Razor代码复用

1.布局&#xff08;Layout&#xff09;复用 Layout的使用&#xff0c;就像WebForm的模板页一样&#xff0c;甚至会更加简单&#xff0c;更加方便和明了。 要使用Layout&#xff0c;首先要在模板页相应的位置添加RenderBody()方法&#xff1a; <!DOCTYPE html><html la…

2.7 编译型和解释型

2.7 编译型和解释型 前面我们使用java和javac命令把Hello&#xff0c;World&#xff01;在控制台输出。那为什么输出&#xff0c;这里我们需要掌握两个知识点。编译型语言和解释型语言。在计算机的高级编程语言就分为编译型语言和解释型语言。而我们的Java既有编译型的特点也有…

docker compose部署ELK

1、准备下载相关镜像 docker pull logstash:7.6.2 docker pull kibana:7.6.2 docker pull elasticsearch:7.6.2 docker pull elastic/filebeat:7.6.22、创建相关文件夹 新建文件夹使用命令&#xff1a;mkdir /opt/docker_elk 在/opt/docker_elk/elasticsearch新建plugins和da…

chatgpt赋能python:Python代码怎么用?一个10年编程经验工程师的实践总结

Python代码怎么用&#xff1f;一个10年编程经验工程师的实践总结 如果你正在学习Python或已经是一名Python开发者&#xff0c;你需要知道如何正确地使用Python代码以实现项目需求。在本文中&#xff0c;我将分享我的10年Python编程经验&#xff0c;并介绍一些关于如何使用Pyth…

零基础认识java-后端 项目结构搭建、目录概况

后端项目构建 1、创建数据库表 2、创建项目 打开 idea&#xff0c;新建一个项目&#xff0c;在 new 一个新项目的时候&#xff0c;选择 Spring Initializr&#xff0c;在选择项目依赖的时候勾选 web下的 Spring Web Starter 和 SQL下的 MySQL Driver 和 MyBatis Framework &am…

Prop type `object` is forbidden

这种错一般是ESLint的配置的规则 项目里搜一下react/forbid-prop-types 可以看到把any和object禁用了&#xff0c;根据需要删除object即可

2023 CCF-百度松果基金正式启动申报!大语言模型、AIGC等热点课题首次公布

5 月 31 日&#xff0c;2023 年 CCF-百度松果基金&#xff08;简称“松果基金”&#xff09;正式启动申报&#xff0c;面向全球高校及科研院所青年学者开放&#xff0c;入选项目将获得松果基金百万课题基金及千万级支持与服务。申报截至 2023 年 7 月 10 日。 本届松果基金共设…