C++学习笔记(二十七):c++ 动态数组vector及优化

news2024/11/15 18:18:09
  • c++的动态数组vector是STL的内容,关于STL,有兴趣可自行网上搜索资料。本节主要介绍vector的基本内容以及vector的简单优化。
  • vector当超过数组最大范围,需要往里面添加新的元素时,会在内存中创建一个比上一个更大的数组,将上一个数组中的所有元素复制过来,然后删除旧的数组。
  • #include <iostream>
    #include <vector>
    
    struct Vertex
    {
    	float x, y, z;
    	Vertex(float x,float y, float z)
    	{
    		this->x = x;
    		this->y = y;
    		this->z = z;
    	}
    };
    
    std::ostream& operator<< (std::ostream& stream, const Vertex& vertex)
    {
    	stream << vertex.x << vertex.y << vertex.z;
    	return stream;
    }
    
    int main()
    {
    	std::vector<Vertex> vertices;
    	vertices.push_back(Vertex(1.3f, 2.1f, 4.4f));
    	vertices.push_back({ 2,3,4 });
    	//两种方式便利vertor
    	//for (int i = 0; i < vertices.size(); i++)
    	//{
    		//std::cout << vertices[i] << std::endl;
    	//}
    	for (Vertex &ver:vertices)  //传入引用的原因时为了尽量减少复制,如果不是引用,则会将每个vertices复制到for循环中,影响性能
    	{
    		std::cout << ver << std::endl;
    	}
    
    	vertices.erase(vertices.begin() + 1); //删除vertices中的第二个元素。因为erase中的参数时一个iterator
    	vertices.clear(); //清空整个vertices中的元素
    
    	std::cin.get();
    	return 0;
    }

    下面简单对vector进行优化

  • vector影响性能的主要原因是当插入新的元素是,原来的vector分配的剩余内存不够时,需要复制原来vector中存在的所有元素,重新分配内存,从而影响程序的性能。

  • #include <iostream>
    #include <vector>
    
    struct Vertex
    {
    	float x, y, z;
    	Vertex(float x,float y, float z)
    	{
    		this->x = x;
    		this->y = y;
    		this->z = z;
    	}
    	//新增一个拷贝构造函数,查看复制操作的产生时机
    	Vertex(const Vertex& ver)
    		:x(ver.x),y(ver.y),z(ver.z)
    	{
    		std::cout << "进行一次复制操作!!!" << std::endl;
    	}
    };
    
    std::ostream& operator<< (std::ostream& stream, const Vertex& vertex)
    {
    	stream << vertex.x << ", " << vertex.y<< ", " << vertex.z;
    	return stream;
    }
    
    int main()
    {
    	std::vector<Vertex> vertices;
    	vertices.push_back(Vertex(1.3f, 2.1f, 4.4f));
    	vertices.push_back({ 2,3,4 });
    	//这个状态下执行三次复制操作
    
    	std::cin.get();
    	return 0;
    }

    运行结果

  • ​​​​​​​

  • #include <iostream>
    #include <vector>
    
    struct Vertex
    {
    	float x, y, z;
    	Vertex(float x,float y, float z)
    	{
    		this->x = x;
    		this->y = y;
    		this->z = z;
    	}
    	//新增一个拷贝构造函数,查看复制操作的产生时机
    	Vertex(const Vertex& ver)
    		:x(ver.x),y(ver.y),z(ver.z)
    	{
    		std::cout << "进行一次复制操作!!!" << std::endl;
    	}
    };
    
    std::ostream& operator<< (std::ostream& stream, const Vertex& vertex)
    {
    	stream << vertex.x << ", " << vertex.y<< ", " << vertex.z;
    	return stream;
    }
    
    int main()
    {
    	std::vector<Vertex> vertices;
    	vertices.reserve(3);
    	//vertices.push_back(Vertex(1.3f, 2.1f, 4.4f));
    	//vertices.push_back({ 2,3,4 });
    	//vertices.push_back(Vertex(3, 4, 5));
    	//提前reserve后,这个状态下执行三次复制操作,是因为push_back操作,每次先在main函数的栈帧创建一个Vertex,然后再将main中创建好的Vertex复制到vertices分配好的内存中
    	vertices.emplace_back(1.3f, 2.1f, 4.4f);
    	vertices.emplace_back( 2,3,4 );
    	vertices.emplace_back(3, 4, 5);
    	//使用emplace_back替换push_back,这个状态下不会执行复制操作,因为push_back是用参数的数据在vertices分配好的内存中创建Vertex对象,不需要再去复制
    
    	std::cin.get();
    	return 0;
    }

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

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

相关文章

RT-Thread:ADC 框架应用,通过 STM32CubeMX 配置 STM32 ADC驱动

关键词&#xff1a;ADC,RT-Thread ADC,STM32 ADC应用 说明&#xff1a;本笔记是记录如何开启 RT-Thread 框架的ADC功能&#xff0c;使用系统自带的ADC函数&#xff0c;并通过 STM32CubeMX 配置 STM32 ADC驱动 。 1. 打开board.h 文件&#xff0c;找到ADC 使用配置的流程&…

CMake入门教程【核心篇】动态库与静态库的差别

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1.概述2.动态库(Shared Libraries)主要特点使用场景3.静态库(Static Libraries)主要特点

java继承Thread实现多线程

1、AdminController文件 package com.controller;import com.myThread.AdminThread; import org.springframework.web.bind.annotation.*;RestController CrossOrigin RequestMapping("/admin") public class AdminController{GetMapping("/{id}")public …

离线安装jenkins:使用rpm安装包

目录 一、安装jdk1.8二、安装yum软件包三、下载rmp安装包四、安装jenkins的rpm安装包五、创建jenkins文件目录六、设置环境变量七、配置jdk位置八、配置Jenkins配置文件九、启动Jenkins十、访问Jenkins十一、安装Jenkins插件 一、安装jdk1.8 根据博客Linux操作系统安装jdk1.8并…

Rollup-plugin-bundle-analyzer VS Rollup-plugin-visualizer

分析和可视化Rollup打包后的文件的插件 Rollup-plugin-bundle-analyzerRollup-plugin-visualizer Rollup-plugin-bundle-analyzer和Rollup-plugin-visualizer都是用于分析和可视化Rollup打包后的文件的插件&#xff0c;但它们在功能和使用方式上存在一些差异。 Rollup-plugi…

作业--day43

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数&#xff0c;将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c…

外包做了5个月,技术退步一大半了。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;20年通过校招进入深圳某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

麒麟操作系统缓存rpm包,制作离线yum源

缓存rpm包&#xff0c;以make为例 mkdir -p /data/yum yumdownloader --resolve --destdir/data/yum make制作离线yum包 yum install createrepo -y cd /data/yum createrepo .写yum配置文件/etc/yum.repos.d/local.repo [local-repo] namelocal-repo baseurlfile:///data/…

分布式锁3: zk实现分布式锁2 使用临时节点(需要自旋)

一 使用临时节点实现分布式锁 1.1 代码截图 1.2 代码如下 由于zookeeper获取链接是一个耗时过程&#xff0c;这里可以在项目启动时&#xff0c;初始化链接&#xff0c;并且只初始化一次。借助于spring特性&#xff0c;代码实现如下&#xff1a; package com.atguigu.distri…

世微 AP5127 DC-DC降压恒流IC 输入12-24 输出9V 2A 车灯方案线路图

此方案应用领域&#xff1a;电动车&#xff0c;摩托车灯照明&#xff0c; 汽车灯照明&#xff0c;手电筒&#xff0c;LED照明等 AP5127 是一款 PWM 工作模式,高效率、外 围简单、内置功率管&#xff0c;适用于 12-100V 输入的高 精度降压 LED 恒流驱动芯片。输出功率可达 25W&a…

【排序算法】二、希尔排序(C/C++)

「前言」文章内容是排序算法之希尔排序的讲解。&#xff08;所有文章已经分类好&#xff0c;放心食用&#xff09; 「归属专栏」排序算法 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 希尔排序1.1 原理1.2 代码实现&#xff08;C/C&#xff09;1.3 特性总结 希尔排序 1.1…

spring Security源码讲解-WebSecurityConfigurerAdapter

使用security我们最常见的代码&#xff1a; Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter {Overrideprotected void configure(HttpSecurity http) throws Exception {http.formLogin().permitAll();http.authorizeRequests().antMatcher…

【Python】DataFrame 使用 concat 横向拼接出现两行问题

问题 在使用 DataFrame 中 concat 横向拼接两个只有一行的 DataFrame 时&#xff0c;最终的结果有两行。 如下图&#xff1a; 原始的 df 分别为&#xff1a; 指定横向合并后是&#xff1a; 这里可以看到是横向拼接了&#xff0c;但是并没有真正意义的横向拼接&#xff0c;而…

AI数字人虚拟现实产业的发展现状与展望

AI数字人虚拟现实产业是当今科技领域备受瞩目的发展方向之一。随着人工智能和虚拟现实技术的迅猛发展&#xff0c;人们对于数字形象的需求不断增加&#xff0c;AI数字人虚拟现实产业正应运而生。本文将从产业现状和未来展望两个方面来描绘AI数字人虚拟现实产业的发展。 首先&a…

编程学习课前准备

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 浏览器和文本编辑器安装 数据分析三大软件安装 操作系统要求 查看Windows系统版本和位数 查看操作系统账户信息 Windows目录显式设置 命令行界面使用 打开命令行 方法一&#xff1a; 方法二&#xff1a; 方法…

MT6762芯片性能参数介绍_MTK联发科处理器

MT6762采用台积电 12 nm FinFET 制程工艺&#xff0c;8* Cortex-A53架构&#xff0c;搭载Android9.0/11.0/12.0操作系统&#xff0c;主频最高达2.0GHz&#xff0c;提供更高阶的功能和出色的体验。 搭载PowerVR GE8329 GPU&#xff0c;运行频率高达 650MHz&#xff0c;实现 20&a…

小游戏选型(一):游戏化设计助力直播间互动和营收

一、社交直播间小游戏火爆 大家好&#xff0c;作为一个技术宅和游戏迷&#xff0c;今天来聊聊近期爆火的社交直播间小游戏的潮流。喜欢冲浪玩社交产品的小伙伴会发现&#xff0c;近期各大平台都推出了直播间社交小游戏&#xff0c;直播间氛围火爆&#xff0c;小游戏玩法简单&a…

Java程序员面试-场景篇

前言 裁员增效潮滚滚而来&#xff0c;特总结一些实际场景方案的面试题&#xff0c;希望对大家找工作有一些帮助。 注册中心 题目&#xff1a; 有三台机器&#xff0c;分别部署了微服务A、微服务B、注册中心&#xff0c;其中A和B都有服务接口提供并正常注册到了注册中心&…

Halcon 模板匹配基于轮廓(形状)

文章目录 halcon 案例 基于缩放比halcon 案例 测单个剃须刀片Halcon 案例创建匹配模板Halcon 通过图像处理创建模型 ROI模型Halcon 亚像素识别Halcon 识别不等比例的图像Halcon 匹配包装袋案例Halcon 创建模板进行匹配Halcon 案例模板匹配与测量Halcon 多模板与多图像的匹配 ha…

CMake入门教程【核心篇】导入外部库Opencv

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 环境准备示例:在Windows上配置OpenCV路径示例:在Linux上配置OpenCV路径环境准备 首先确保你的系统中安装了CMake。可以通过以下命令安装: Windows: 下载并…