C++ vector类成员函数介绍
目录
🤔vector模板介绍:
🤔特点:
🤔vector的成员函数:
🔍vector构造函数:
🔍vector赋值函数
🔍vector容器的判断函数
resize函数的重点内容:
🔍 vector的删除和插入
🔍 vector数据存取功能:
🔍vector互换容器
swap 实际用途:
🤔结束!
🤔vector模板介绍:
📖vector模板是C++标准库中的一个容器类,被设计为动态数组,即它可以根据需要自动分配内存空间来存储元素。vector模板的本质是一个类模板,它使用了C++语言中的模板技术,使其能够适应不同的数据类型,提供了一种通用的容器类实现。
📖具体而言,vector类使用连续的内存来存储元素,它提供了访问和操作元素的方法,如push_back()、pop_back()、at()、[]等,同时还提供了一些其他的方法,如size()、capacity()、empty()等,以帮助用户管理容器的大小和内存分配等问题。在实际编程中,vector模板可以作为一种通用的容器使用,可以方便地存储和管理各种类型的数据。
🤔特点:
📖1.动态扩容:vector模板可以动态地扩充容器大小,当容器中元素数量增加时,vector会自动分配更多的内存空间来存储元素。这样可以避免手动分配内存空间带来的麻烦和错误。
📖2.随机访问:vector中的元素是连续存储的,因此,可以通过下标的方式(使用[]操作符)来访问任何一个元素。这使得vector可以高效地进行随机访问。
📖3.内存管理:vector会自动管理内存,当元素被删除或者容器的大小被缩小时,vector会自动回收不再需要的内存。这种管理方式可以避免内存泄漏问题。
📖4.插入和删除元素:vector提供了多种插入和删除元素的方法,如push_back() pop_back()、erase()等。这些方法可以方便地操作容器中的元素。
📖5.大小变化:vector中的元素数量可以随时变化,因此可以方便地进行动态管理。同时,vector还提供了一些方法,如size()、capacity()、empty()等,以帮助用户管理容器的大小和内存分配等问题。
🤔vector的成员函数:
🔍vector构造函数:
📖1.采用模板实现类实现,默认构造函数:vector <T> v;
vector<类型>名称;
📖2.将v[begin(),end())区间中的元素拷贝给自身:vector<v.begin(),v.end()>;
vector<int>v1;
vector<int>v2(v1.begin(), v1.end());
📖3.将n个elem元素拷贝给自身:vector(n,elem);
vector<int>v3 (n, elem);
📖4.将另外一个vector类对象拷贝给自身:vector(const vector &vec);
vector<int> v4(v3);
📖代码实例:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << "";}
}
void test01()
{ //默认构造 无参构造vector<int>v1;for (int i = 0; i < 9; i++){v1.push_back(i);}cout << "默认构造:";printv(v1);cout << endl;//区间拷贝构造vector<int>v2(v1.begin(), v1.end());cout << "区间拷贝构造:";printv(v2);cout << endl;//n个elem构造vector<int>v3 (10, 8);cout << "n个elem构造:";printv(v3);cout << endl;//拷贝构造vector<int> v4(v3);cout << "拷贝构造:";printv(v4);cout << endl;}
int main()
{test01();
}
📖运行结果:
🔍vector赋值函数
📖1.将n个elem拷贝赋值给本身:assign(n,elem);
vector<int>v1;
v1.assign(n, elem);
📖2.将[beg,end)区间中的数据拷贝赋值给本身:assign(begin,end);
vector<int>v2;
v2.assign(v1.begin(), v1.end());
📖3.重载等号运算符:vector &operator =(const vector &vec)
vector<int>v3=v2;
📖代码实例:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}
void test01()
{ //将n个elem拷贝赋值给本身vector<int>v1;v1.assign(10, 8);cout << "将n个elem拷贝赋值给本身";printv(v1);//将[beg,end)区中的数据拷贝复制给自己vector<int>v2;v2.assign(v1.begin(), v1.end());cout << "将[beg,end)区中的数据拷贝复制给自己";printv(v2);//重载等号赋值运算符vector<int>v3=v2;cout << "重载等号赋值运算符";printv(v3);}
int main()
{test01();
}
📖运行结果:
🔍vector容器的判断函数
📖1.判断容器是否为空:empty();
📖2.容器的容量:capacity();
📖3.返回容器中元素的个数:size();
📖4.重新指定容器的长度,如果容器变长,就以默认值填充,如果容器变短,则末尾超过容器长度的元素被删除:resize(int num);
📖5.重新指定容器的长度为num,如果容器的长度变长,就以elem值填充新位置,如果容器变短,则末尾超出容器长度元素被删除:resize(int num,elem);
📖代码实例:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}
void test01()
{vector<int>v1;v1.assign(8, 4);printv(v1);cout <<"该容器是否为空? " << v1.empty() << endl; //1为空,0为不空cout <<"该容器的容量是" << v1.capacity() << endl;cout <<"该容器中的元素个数是: " << v1.size() << endl;v1.resize(12);printv(v1);v1.resize(14, 8);printv(v1);}
int main()
{test01();
}
📖运行结果:
resize函数的重点内容:
📖1.编译器扩容会比你要求扩容的多,例如你写resize(2000),编译器实际可能扩到2300。
📖2.resize函数的缩放机制不一样❌,如下:
📖 代码验证:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}
void test02()
{vector <int> v;for (int i = 0; i < 100000; i++){v.push_back(i);}v.resize(4);cout << "v的容量为:" << v.capacity() << endl;;cout << "v的大小为:" << v.size() << endl;v.resize(200000);cout << "v.resize(200000)后v的容量为:" << v.capacity() << endl;;cout << "v.resize(200000)后v的大小为:" << v.size() << endl;v.resize(4);cout << "v.resize(4)后v的容量为:" << v.capacity() << endl;;cout << "v.resize(4)后v的大小为:" << v.size() << endl;}
int main()
{test02();
}
📖运行结果:
🔍 vector的删除和插入
📖1.对容器尾部元素进行插入:push_back();
📖2.删除最后一个 元素:pop_back();
📖3.从pos位置删除元素elem:insert(const_iterator pos,elem);
📖4.从pos位置上插入count个elem:insert(const _interator pos,int count,ele);
📖5.删除迭代器指向的元素:erase(const_iterator pos);
📖6.删除迭代器从start到end的所有元素:earse(const_iterator start,const_iterator end);
📖7.删除容器中所有元素:clear();
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}
int main()
{vector<int>v1(10, 8);printv(v1);//向末尾插入一个元素9v1.push_back(9);cout << "插入元素后:";printv(v1);//删除末尾元素 v1.pop_back();cout << "删除元素后:";printv(v1);//在开头的位置插入元素1v1.insert(v1.begin(), 1);cout << "开头插入元素后:";printv(v1);//在末尾的位置插入5个6v1.insert(v1.begin(), 5, 6);cout << "末尾插入元素后:";printv(v1);//删除开头的第一个元素v1.erase(v1.begin());cout << "删除开头元素后:";printv(v1);//删除区间内的所有元素v1.erase(v1.begin(), v1.end());cout << "删除指定区间元素后:";printv(v1);//先赋值再清空avector<int>v2(10, 8);v1.clear();cout << "清空容器元素后:";printv(v1);
}
📖运行结果:
🔍 vector数据存取功能:
📖1.取出第idx+1个元素 :at(int idx);
📖2.取出第idx+1个元素:operator[];
📖3.取出容器中第一个元素:front();
📖4.取出容器中最后一个元素:back();
📖元素下标是从0开始的。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}
int main()
{vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);printv(v1);cout <<"第三个元素为:" << v1.at(2) << endl;cout <<"第四个元素为" << v1[3] << endl;cout <<"第一个元素为" << v1.front() << endl;cout <<"最后一个元素为" << v1.back() << endl;}
📖运行结果:
🔍vector互换容器
📖1.将另一个容器与自身进行交换:swap(vec);
📖代码实例:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}
int main()
{cout << "互换前:" << endl;vector<int>v1(10, 8);printv(v1);vector<int>v2(10, 6);printv(v2);cout << "互换后:" << endl;v1.swap(v2);printv(v1);printv(v2);
}
swap 实际用途:
📖在上面我们已经讲过resize在缩小容器的时候,只能缩小容器的实际使用大小,而不能修改他的容量,这样就会造成大量的内存浪费,而swap函数就提供了一种解决方法:
代码实例:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printv(vector<int >& v)
{for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << " ";}cout << endl;
}
void test01()
{vector<int>v1(10, 8);printv(v1);vector<int>v2(10, 6);printv(v2);v1.swap(v2);printv(v1);printv(v2);
}
void test02()
{vector <int> v;for (int i = 0; i < 100000; i++){v.push_back(i);}v.resize(4);cout << "v的容量为:" << v.capacity() << endl;;cout << "v的大小为:" << v.size() << endl;cout << "巧用swap收缩内存";v.resize(4);vector<int>(v).swap(v);cout << "v的容量为:" << v.capacity() << endl;;cout << "v的大小为:" << v.size() << endl;
}
int main()
{test02();
}
📖运行结果:
📖 我们来详细讲解一下原理:
📖先看缩小时用到的代码:
vector<int>(v).swap(v);
📖这串代码实际上是利用拷贝构造,创建了一个匿名对象,将v拷贝给这个匿名对象,此时匿名对象的容量和使用大小都等于v的实际使用大小,再在让这个匿名对象使用内置swap函数实现容量的转换。
📖图示:
🤔结束!
相关文章:

C++ vector类成员函数介绍
目录 🤔vector模板介绍: 🤔特点: 🤔vector的成员函数: 🔍vector构造函数: 🔍vector赋值函数 🔍vector容器的判断函数 resize函数的重点内容: …...

【C++】二叉搜索树Binary Search Tree
Binary Search Tree 二叉搜索树的概念二叉搜索树的操作二叉搜索树的实现查找插入删除 二叉搜索树的应用二叉搜索树的性能分析 二叉搜索树的概念 二叉搜索树又被称为二叉排序树,顾名思义,当我们使用中序遍历时,会得到一个有序的序列。二叉搜索…...

Hover.css动画库的使用
目录 1、 Hover.css是什么? 2、引入 2.1、整个文件引入 2.2、复制所需要的代码 案例: 1. 卷边效果 2. 调整大小的卷边 类别: 1、 Hover.css是什么? Hover.css是一个CSS3鼠标悬停的动画方案,里面包含了许多纯c…...

Baumer工业相机堡盟工业相机如何通过文件保存和导入的方式保存和载入相机的各类参数(C#)
Baumer工业相机堡盟工业相机如何通过文件保存和导入的方式使保存和载入相机的各类参数(C#) Baumer工业相机Baumer工业相机BGAPISDK中UserSet的技术背景相机配置文件代码案例分享第一步:保存相机当前参数设置doUserSetStore为文件第二步&#…...

封装设计!抽象BasePage,提升WEB自动化测试用例质量和效率
目录 前言: 一、什么是抽象BasePage 二、BasePage中的属性和方法 三、BasePage中的代码实现 四、抽象Page对象 五、测试用例 六、总结 前言: 对于测试工程师来说,WEB自动化测试是非常重要的一部分。然而,WEB自动化测试的开…...

c primer plus学习笔记(一)
1.int的大小恒定就是32位么? 不是的,int大小是跟着系统走的,不是在各个系统里固定不变的。 32位系统int就是32位。64位系统,int就是64位。short 和long的长度则跟着int走,一般来说int是32位,short就是16位…...

C语言2:说心里话
描述 分两次从控制台接收用户的两个输入:第一个内容为“人名”,第一个内容为“心里 话”。 然后将这两个输入内容组成如下句型并输出出来: 1.(人名),I want to say,(心里话 2. 输入输出示例: 输入ÿ…...

任务19 简单个人电话号码查询系统
系列文章 任务19 简单个人电话号码查询系统 问题描述 人们在日常生活中经常需要查找某个人或某个单位的电话号码,本实验将实现一个简单的个人电话号码查询系统,根据用户输入的信息(例如姓名等)进行快速查询。基本要求 (1) 在外存…...

day4--链表内指定区间反转
迭代方法 1. 第m个节点的前一个节点pre和第n个节点; 2. 将第m个节点到第n个节点的链表部分反转; 3. 将pre节点的next指向反转后链表的头节点,将反转后链表的尾节点的next指向n1节点。 /*** struct ListNode {* int val;* struct ListNode…...

HTTP状态码是什么?常用的状态码有什么?
HTTP(Hypertext Transfer Protocol)是一种用于传输超文本和其他内容的应用层协议。 历史: HTTP最早的版本是HTTP/0.9,它只支持简单的 GET 请求,而不支持其他操作。 HTTP/1.0 版本增加了许多新特性,如支持…...

【软件分析/静态分析】学习笔记01——Introduction
🔗 课程链接:李樾老师和谭天老师的:南京大学《软件分析》课程01(Introduction)_哔哩哔哩_bilibili 目录 一、静态程序分析介绍 1.1 PL and Static Analysis 程序语言和静态分析 1.2 为什么要学 Static Analysis? …...

Java数组
文章目录 前言一维数组数组定义创建数组数组的内存模型数组数据初始化数组元素访问遍历数组length常见数组异常 二分查找数组的操作数组的复制数组的排序 二维数组扩展 Java中定义数组的语法如下: 数据类型[] 数组名 new 数据类型[数组长度]; 数据类型指的是数组中…...

【数据库原理入门】
数据库原理:深入探索与实践指南 引言 在我们的日常生活中,数据库无处不在,从在线购物、银行交易到社交媒体,都离不开数据库。要想成为一名出色的开发者,理解数据库原理是非常重要的。本文将以简明易懂的方式…...

练习Vue烘培坊项目
烘培坊项目 文章目录 烘培坊项目项目概述项目页面展示后台管理页面登录页面文章详情页面稿件发布页面 项目关键代码实现后台管理页面稿件管理页面内容列表页面文章详情页面烘培坊主页面注册页面登录页面个人信息页面稿件发布页面 项目概述 烘培坊(Bakery࿰…...

API测试| 了解API接口测试| API接口测试指南
什么是API? API是一个缩写,它代表了一个 pplication P AGC软件覆盖整个房间。API是用于构建软件应用程序的一组例程,协议和工具。API指定一个软件程序应如何与其他软件程序进行交互。 例行程序:执行特定任务的程序。例程也称为过…...

使用canvas给图片添加水印
上接文章“图片处理” canvas元素其实就是一个画布,我们可以很方便地绘制一些文字、线条、图形等,它也可以将一个img标签里渲染的图片画在画布上。 我们在上传文件到后端的时候,使用input标签读取用户本地文件后得到的其实是一个Blob对象&a…...

栈和队列的概念和实现
栈 栈 定义:只能在一端进行插入或删除操作的的线性表 主要特点:后进先出 存储结构的实现 顺序存储结构 链式存储结构 用途:通常作为一种临时存放数据的容器。如果后存入的元素先处理则使用栈。比如用于保存函…...

PostgreSQL 源码部署
文章目录 说明1. 准备工作1.1 源码包下载1.2 解压安装目录1.3 安装依赖包1.4 添加用户1.5 创建数据目录 2. 编译安装2.1 源码编译2.2 配置环境变量2.3 初始化数据库2.4 启动数据库2.5 连接数据库 3. 参数调整3.1 配置 pg_hba3.2 监听相关2.4 日志文件2.5 内存参数 说明 本篇文…...

医疗IT系统安科瑞隔离电源装置在医院的应用
【摘要】介绍该三级综合医院采用安科瑞隔离电源系统5件套,使用落地式配电柜安装方式,从而实现将TN系统转化为IT系统,以及系统绝缘情况监测。 【关键词】医用隔离电源系统;IT系统;绝缘情况监测;三级综合医院…...

高压放大器在3D打印中的应用
随着3D打印技术的快速发展,高压放大器在3D打印中的应用越来越受到人们的关注。高压放大器在3D打印中扮演着非常重要的角色,可以提高3D打印的效率和精度,从而实现更高的打印质量。本文将详细介绍高压放大器在3D打印中的应用及其原理。 高压放…...

chatgpt赋能python:Python中的三角函数介绍
Python中的三角函数介绍 Python作为一种高级编程语言,可以处理基础算术运算、三角函数等高等数学的操作。其中,三角函数是常用的数学函数之一,Pyhon中的三角函数包括正弦函数、余弦函数、正切函数等。 正弦函数 正弦函数在三角学中是最基本…...

异常检测论文1
本文仅作为个人阅读文献,做笔记记录。 <> \usepackage[dvipsnames]{xcolor} 一、摘要部分: 我们发现,现有的数据集偏向于局部结构异常,如划痕、凹痕或污染。特别是,它们缺乏违反逻辑约束形式的异常࿰…...

linux搭建hadoop环境
1、安装JDK (1)下载安装JDK:确保计算机联网之后命令行输入下面命令安装JDK sudo apt-get install sun-java8-jdk (2)配置计算机Java环境:打开/etc/profile,在文件最后输入下面…...

02 Maven创建及使用
maven作用 主要用作基于java平台的项目 maven能提供一种项目配置 maven能自动从maven的中央仓库帮我们自动下载并管路项目依赖的jar包 提供了标准的目录结构 中央仓库两种类型:共有的中央仓库:私有中央仓库 使用mvn -v查看是否安装成功 修改本地仓库的的位置 在setting…...

如何在 Rocky Linux 上检查磁盘空间?
在 Rocky Linux 上检查磁盘空间是系统管理和维护的重要任务之一。磁盘空间的监控和管理可以帮助我们及时发现和解决存储空间不足的问题,以确保系统的正常运行。本文将详细介绍在 Rocky Linux 上检查磁盘空间的方法。 方法 1:使用 df 命令 df 命令是 Li…...

【软考系统规划与管理师笔记】第2篇 信息技术知识1
目录 1 软件工程 1.1 软件需求分析与定义 1.2 软件设计、测试与维护 1.3 软件质量保证及质量评价 1.4 软件配置管理 1.5 软件过程管理 1.6 软件复用 2 面向对象系统分析与设计 2.1 面向对象设计的基本概念 2.2统一建模语言与可视化建模 3. 应用集成技术 3.1 数据库与…...

【无标题】ELISA-3(加装跟踪装置)—让群体协作更智能!
群体智能是近年来发展迅速的一个人工智能学科领域,通过对蚂蚁、蜜蜂等为代表的社会性昆虫群体行为的研究,实现分布式等智能行为。作为新一代人工智能的重要方向,群体智能通常用于无人机、机器人集群的协同作业。目前,群体智能在基…...

Dubbo源码解析一服务暴露与发现
Dubbo 服务暴露与发现 1. Spring中自定义Schema1.1 案例使用1.2 dubbo中的相关对象 2. 服务暴露机制2.1 术语解释2.2 流程机制2.3 源码分析2.3.1 导出入口2.3.2 导出服务到本地2.3.3 导出服务到远程(重点)2.3.4 开启Netty服务2.3.5 服务注册2.3.6 总结 3. 服务发现3.1 服务发现…...

有哪些工具软件一旦用了就离不开?
💖前言 目前,随着科技的快速发展,电脑已经进入了许许多多人的生活 ,在平日的学习、工作和生活里,我们会用的各种各样的强大软件。市面上除了某些大公司开发在强大软件,还有各路大神开发具有某些功能的强大…...

ObjectARX如何判断点和多段线的关系
目录 1 基本思路2 相关知识点2.1 ECS坐标系概述2.2 其他点坐标转换接口2.3 如何获取多段线的顶点ECS坐标 3 实现例程3.1 接口实现3.2 测试代码 4 实现效果 在CAD的二次开发中,点和多段线的关系是一个非常重要且常见的问题,本文实现例程以张帆所著《Objec…...