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扫描…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
