c++提高篇——vector容器
一、基本概念
vector教据结构和数组非常相似,也称为单端数组,但是数组是静态空间,而vector可以动态扩展。
动态的扩展流程如下:
动态扩展并不是在原空间之后续接新空间,而是找更大的广存空间,然后将原数据拷贝新空间,释放原空间。
vector容器的迭代器是支持随机访问的迭代器,也就是说可以随机访问容器内的任何一个位置的数据。
二、vector的构造函数
vector v; 采用模板实现类实现,默认构造函效。
vector(v.begin(), v.end( )); 将v[begin(), end())区间中的元素拷贝给本身。
vector(n,elem) ; 构造函数将n个elem拷贝给本身。
vector( const vector &vec); 拷贝构造函数。
具体的实现方法如下所示:
//默认构造方式vector<int> v;for (int i = 0; i < 4; i++){v.push_back(i);}VectorPrint(v);// 通过区间的方式进行构造vector<int>v1(v.begin(), v.end());VectorPrint(v1);//通过n个elem的方式构造vector<int>v2(2, 100);VectorPrint(v2);//通过拷贝构造的方式进行传递vector<int>v3(v2);VectorPrint(v3);
三、vector赋值操作
当我们构建好vector之后,我们可以对vector进行赋值操作,具体的样例如下:
vector& operator=( const vector &vec); 重载等号操作符。
assign(beg, end) ;将[beg, end)区间中的数据拷贝赋值给本身。
assign(n,elen); 将n个elem拷贝赋值给本身。
具体的实现细节如下:
//赋值操作:重载等号vector<int>v1;v1 = v;VectorPrint(v1);//赋值操作:assign操作1vector<int>v2;v2.assign(v1.begin(), v1.end());VectorPrint(v2);//赋值操作:assign操作2vector<int>v3;v3.assign(2, 100);VectorPrint(v3);
四、vector容量和大小
具体的函数接口如下:
empty( ); 判断容器是否为空
capacity(); 容器的容量
size(); 返回容器中元素的个数
resize( int num); 重新指定容器的长度为num,若容器变长,则以默认值0填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
resize( int nun, elem); 重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除
具体的实现样例如下:
vector<int> v;for (int i = 0; i < 10; i++){v.push_back(i);}if (v.empty()){cout << "容器为空" << endl;}else{cout << "容器不为空" << endl;cout << "容器容量为:" << v.capacity() << endl; cout << "容器的大小为:" << v.size() << endl;} //重新指定容器大小,多出的位置用默认值0填充v.resize(10);//重新指定容器大小,多出的位置用设置值10填充v.resize(15, 10);//重新指定容器大小,超出的部分会被删掉v.resize(2);
五、vector插入和删除
具体的实现接口如下:
push_back(ele);尾部插入元素ele
pop_back();删除最后一个元素
insert (const_iterator pos,ele);迭代器指向位pos插入元素ele
insert( const_iterator pos,int count,ele);迭代器指向位置pos插入count个元素ele
erase(const_iterator pos);删除迭代器指向的元素
erase(const_iterator start,const_iterator end);删除迭代器从start到end之间的元素
clear();删除容器中所有元素
具体样例如下:
vector<int> v;//尾插法插入数据v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);vectorPrint(v);//尾部删除法,一次删一个v.pop_back();vectorPrint(v);//插入,第一个参数是迭代器v.insert(v.begin(), 100);vectorPrint(v);//插入,第一个参数是迭代器,插入两个10v.insert(v.begin(), 2, 10);vectorPrint(v);//删除v.erase(v.begin()+3);vectorPrint(v);//删除一个区间v.erase(v.begin() + 3, v.end()-2);vectorPrint(v);//清空v.clear();vectorPrint(v);
输出结果为:
1 2 3 4 5
1 2 3 4
100 1 2 3 4
10 10 100 1 2 3 4
10 10 100 2 3 4
10 10 100 3 4
六、vector的数据存取
具体的实现接口如下:
at( int idx); 返回索引idx所指的数据
operator[]: 返回索引idx所指的数据
front( ); 返回容器中第一个数据元素
back();返回容器中最后一个数据元素
具体实现样例如下:
for (int i = 0; i < v.size(); i++){//使用at接口进行输出cout << v.at(i) << " ";//使用索引值进行输出cout << v[i] << " ";//获取第一个元素cout << v.front() << endl;//获取最后一个元素cout << v.back() << endl;}
七、vector互换容器
实现两个容器内元素进行互换。
函数接口如下:
swap(vec); 将vec与本身的元素互换
具体的实现样例如下:
void PrintVector(vector<int> &v)
{for (vector<int>::iterator it = v.begin(); it < v.end(); it++){cout << *it << " ";} cout << endl;
}vector<int> v;vector<int> v1;for (int i = 0; i < 3; i++){v.push_back(i);v1.push_back(i+10);}PrintVector(v);PrintVector(v1);v.swap(v1);PrintVector(v);PrintVector(v1);
以上接口的实用技巧:
vector<int> v;for (int i = 0; i < 3000; i++){v.push_back(i);} cout << v.capacity() << "容量"<<endl;cout << v.size() << "大小"<<endl;//当我们重置容器的大小之后1v.resize(2);cout << v.capacity() << "容量"<<endl;cout << v.size() << "大小"<<endl;
有以上的代码,代码的输入为:
3597容量
3000大小
3597容量
2大小
我们可以看出,当最先的容器申请了3597大小的容量,但是当我们重置容器大小之后,虽然容器的大小变小了,但是容量并没有变化。这就造成了资源的浪费。我们可以通过以下的操作来收缩容器的容量
vector<int>(v).swap(v);
对以上操作进行解释,vector(v)操作是创建了一个新的对象,该对象为匿名对象,这个匿名对象是按照v的大小来初始化,初始化之后调用swap操作之后将指向v的指针指向了该匿名对象,匿名对象指针指向了v,当匿名对象实用完成之后,编译器会将匿名对象指针指向的内存进行回收。通过这样的一个操作达到了收缩容量的作用。
八、vector的预留空间
该操作可以减少vector在动态扩展容量时的扩展次数,具体的接口说明如下:
reserve(int len); 容器预留len个元素长度。预留位置不初始化,元素不可访问。
具体的实现样例如下:
vector<int> v;//提前开辟够量的空间v.reserve(199999);int num = 0;int *p = NULL;for (int i = 0; i < 199999; i++){v.push_back(i);if (p != &v[0]){p = &v[0];num++;}}cout << num << endl;
}
当随着容器内需要存放的数据不断的增大,容器需要不断的申请内存空间,这样的操作需要很大的工程,所以为了避免这样重复的操作,所以我们需要实现申请一块已经足够的空间。
相关文章:

c++提高篇——vector容器
一、基本概念 vector教据结构和数组非常相似,也称为单端数组,但是数组是静态空间,而vector可以动态扩展。 动态的扩展流程如下: 动态扩展并不是在原空间之后续接新空间,而是找更大的广存空间,然后将原数据拷贝新空间&…...

使用BP神经网络诊断恶性乳腺癌(Matlab代码实现)
目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨💻4 Matlab代码 💥1 概述 1.1.算法简介 BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出…...
# Rust Web入门(二):Actix
本教程笔记来自 杨旭老师的 rust web 全栈教程,链接如下: https://www.bilibili.com/video/BV1RP4y1G7KF?p1&vd_source8595fbbf160cc11a0cc07cadacf22951 学习 Rust Web 需要学习 rust 的前置知识可以学习杨旭老师的另一门教程 https://www.bili…...
jvm之String
基本特性 字符串,使用一对""引起来表示声明为final的,不可被继承实现了Serializable接口:表示字符串是支持序列化的实现了Comparable接口:表示String 可以比较大小在jdk8及以前内部定义了final char[] value用于存储字…...
WebRTC系列-工具系列之ByteBuffer,BitBuffer及相关类
文章目录 1. 类介绍1.1 ByteBuffer及子类1.2 BitBuffer类1.3 基础内存操作类BufferT2. 源码分析(stun response消息解析)2.1 消息头解析2.2 消息中Attribute解析3. 结语在之前的文章 WebRTC系列-Qos系列之RTP/RTCP协议分析及后续的文章中详细的介绍了RTP/RTCP协议的相关内容,…...

Spring中bean的生命周期(通俗易懂)
具体流程 bean的生命周期分4个阶段: 1.实例化 2.属性赋值 3.初始化 4.销毁 实例化就是在内存中new()出一个对象,属性赋值就是给那些被Autowired修饰的属性注入对象,销毁是在Spring容器关闭时触发,初始化的步骤比较…...

雷达编程实战之恒虚警率(CFAR)检测
在雷达系统中,目标检测是一项非常重要的任务。检测本身非常简单,它将信号与阈值进行比较,超过阈值的信号则认为是目标信号,所以目标检测的真正工作是寻找适当的阈值。由于目标误检的严重后果,因此雷达系统希望有一个检…...

Github隐藏功能:显示自己的README,Github 个人首页的 README,这样玩儿
内容概览 前言创建仓库修改 README 的内容总结前言 大家最近有没有发现这个现象,有些名人的 Github 首页变得更丰富了?尤其是那个夺目的 README 板块!!! 请看,这是 iOS 喵神 的 Github 首页: …...
@JsonSerialize—优雅地封装返回值
1.场景项目开发中给前端提供查询接口时,经常遇到需要将从数据库中取出来的字段值做一层重新封装。比如数据库中存的状态值是数字,返回给前端的时候,前端并不知道这个数值代表什么意思。此时,有两种方式:(1&…...

【Python网络编程】利用Python进行TCP、UDP套接字编程
之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验。 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接字将该行发送到服务器。 2.服务…...

fuzz测试之libfuzzer使用小结
fuzz测试之libfuzzer使用小结背景基本原理使用方法主调DEMO参考资料背景 项目中,为测试算法的鲁棒性,经常会用到fuzz测试进行压力测试。fuzz测试是一种模糊测试方法,本质是通过灌入各种变异的随机数据,去遍历不同函数分支…...

电子标签拣货系统——外接供电版
Power_DC24v 型号:Power_DC24v24V电源适配器级联线:长30cm直径:15mmCK_Wire_V1 型号:CK_Wire_V1连接电源适配器级联线:长30cm公线:长宽厚 14*11*9mm母线:长宽厚 13*5.5*3mmCK_Wire_V2 型号&…...

为什么启动一个线程不用run()方法,而是用start()方法
在使用java多线程时,有三种方式创建线程 复习传送门 当使用继承Thread来实现多线程时, 我们会把线程执行的代码写在run() 方法中, 使用Thread的start()方法来启动一个线程。 代码如下: public class ThreadDemo extends Thread{O…...

Java File相关操作
文章目录File文件操作IO流处理流缓冲流转换流对象流File文件操作 利用File类来操作。 文件操作中常用到相对目录和绝对路径 package org.File; import java.io.File; public class demo01 { public static void main(String[] args) { try{ File file new File("…...

LabVIEW利用矢量量化直方图开发人脸识别
LabVIEW利用矢量量化直方图开发人脸识别通常,人脸识别系统会检查场景的静止图像或视频图像,然后使用存储的人脸数据库识别或验证场景中的一个或多个人。我程序专注于静止图像人脸识别,使用来自众所周知的人脸数据库的人脸图像,用于…...

RK3568工业开发板工控板说明
说明HW356X-GKA是采用中高端的通用型 SOC,一款基于Rockchip公司RK3568处理器的工控主板。主板标配处理器为Cortex-A55四核,最高主频2GHz的RK3568处理器,内置4GB DDR4内存(最大8GB),32GB eMMC存储。集成4核 arm架构 A55 处理器和Ma…...

JavaScript Web API 来构建你不了解的网站
随着技术的日新月异,为开发人员提供了令人难以置信的新工具和API。 但据了解,在100 多个 API中,只有5%被开发人员积极使用。 随着技术的日新月异,为开发人员提供了令人难以置信的新工具和API。但据了解,在100 多个 A…...

KeePass敏感信息明文传输漏洞复现 (CVE-2023-24055)
一、漏洞描述 漏洞简述 KeePass 是一款免费的开源密码管理器,可帮助您以安全的方式管理您的密码。您可以将所有密码存储在一个数据库中,该数据库由一把万能钥匙锁定。因此,您只需记住一个主密钥即可解锁整个数据库。数据库文件使用目前已知…...
Android 11 中的权限更新
官网:https://developer.android.com/about/versions/11/privacy/permissions#audit-by-feature Android 11 使用户能够为位置、麦克风和摄像头指定更精细的权限。此外,系统会重置针对 Android 11 或更高版本的未使用应用程序的权限,如果应用…...

october-cms
环境准备 靶机链接:百度网盘 请输入提取码 提取码:3e4s 虚拟机网络链接模式:桥接模式 攻击机系统:kali linux 2021.1 信息收集 1.探测目标靶机ip。 2.探测靶机开放端口和服务情况。 漏洞探测 1.访问网页 2.用dirsearch扫描…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...
OpenGL-什么是软OpenGL/软渲染/软光栅?
软OpenGL(Software OpenGL)或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式(包括几何处理、光栅化、着色等),不依赖GPU硬件加速。这种模式通常性能较低,但兼容性极强,常用于不支持硬件加速…...

GC1808:高性能音频ADC的卓越之选
在音频处理领域,高质量的音频模数转换器(ADC)是实现精准音频数字化的关键。GC1808,一款96kHz、24bit立体声音频ADC,以其卓越的性能和高性价比脱颖而出,成为众多音频设备制造商的理想选择。 GC1808集成了64倍…...

[KCTF]CORE CrackMe v2.0
这个Reverse比较古老,已经有20多年了,但难度确实不小。 先查壳 upx压缩壳,0.72,废弃版本,工具无法解压。 反正不用IDA进行调试,直接x32dbg中,dump内存,保存后拖入IDA。 这里说一下…...