C++STL之vector 容器

news2024/10/7 10:15:56

                                        食用指南:本文在有C++基础的情况下食用更佳  

                                       🍀本文前置知识:C++基础

                                       ♈️今日夜电波:恋 —星野源

                                                                0:13 ━━━━━━️💟──────── 4:13
                                                                    🔄   ◀️   ⏸   ▶️    ☰ 

                                      💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍 


目录

🍒一、vector 容器基本概念

        什么是vector?

         vector基本概念

         vector的结构

🍈二、vector 迭代器

🍇 三、vector API

         1、vector 构造函数

         2、赋值与交换语句

         3、vector大小操作

        4、使用resize swap收缩容器的容量(难点)

        5、reserve预留空间大小

        6、数据的存取

        7、插入和删除


🍒一、vector 容器基本概念

        什么是vector?

        vector 是 C++ STL 中的一种顺序容器,其内部实现是通过动态数组实现的,可以存储任意类型的数据。vector可以自动调整大小,当容器中的元素数量增加或减少时,可以自动重新分配内存。vector支持随机访问,可以像数组一样访问其中的元素,同时也支持在容器的末尾添加和删除元素。vector是C++标准库中的一个重要组件。

         vector基本概念

  1. 数据存储方式: vector 内部使用动态数组实现数据的存储,因此它可以随意扩展和缩小自身的存储空间,而且相比于数组,vector 更加灵活和方便。

  2. 大小和容量: vector 具有两个概念——大小和容量,大小表示当前 vector 中实际存储的元素数量,而容量则表示 vector 内部实际分配的存储空间大小。当 vector 容量不足时,会自动重新分配内存并将元素复制到新的内存中。

  3. 迭代器: vector 提供了迭代器,可以通过迭代器来遍历 vector 中的元素。vector 有很多种迭代器,比如 iteratorconst_iteratorreverse_iteratorconst_reverse_iterator 等。

  4. 增删改查操作: vector 提供了很多种便捷的增删改查操作,比如 push_backpop_backinserteraseclear 等。

  5. 特殊操作: vector 还提供了一些特殊的操作,比如使用 reserve 函数预分配内存、使用 resize 函数改变 vector 的大小等等。

         vector的结构

        一图让你明白~


🍈二、vector 迭代器

        Vector 维护一个线性空间, 所以不论元素的型别如何, 普通指针都可以作为vector 的迭代器, 因为 vector 迭代器所需要的操作行为, 如 operaroe, operator->,operator++, operator--, operator+, operator-, operator+=, operator-=, 普通指针天生具备。 Vector 支持随机存取, 而普通指针正有着这样的能力。 所以 vector 提供的是随机访问迭代器(Random Access Iterators)。根据上述描述, 如果我们写如下的代码: Vector::iterator it1; Vector::iterator it2; it1 的型别其实就是 Int,it2 的型别其实就是 Teacher*。

 


🍇 三、vector API

         1、vector 构造函数

vector<T> v; //采用模板实现类实现, 默认构造函数
vector(v.begin(), v.end());//将 v[begin(), end())区间中的元素拷贝给本身。
vector(n, elem);//构造函数将 n 个 elem 拷贝给本身。
vector(const vector &vec);//拷贝构造函数。


         2、赋值与交换语句

assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);//将 n 个 elem 拷贝赋值给本身。
vector& operator=(const vector &vec);//重载等号操作符
swap(vec);// 将 vec 与本身的元素互换。

        🌰

void printVectorInt(vector<int>& v)
 {
	 for (vector<int>::iterator it = v.begin(); it != v.end(); it++)//v.begin()和v.end()可以看作是指向头尾的指针
		 {
		 cout << *it << " ";
		 }
	 cout << endl;
 }

 void test01()
 {
	 vector<int> v1(5, 10);
	 vector<int> v2;
	
	 //vector& operator=(const vector &vec);//重载等号操作符
	 v2 = v1;
	 printVectorInt(v2);
	
	 //assign(n, elem);//将n个elem拷贝赋值给本身
	 vector<int> v3;
	 v3.assign(5, 100);
	 printVectorInt(v3);
	
	 //assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身
	 vector<int> v4;
	 v4.assign(v3.begin(), v3.end());
	 printVectorInt(v4); 
	 //swap(vec);// 将vec与本身的元素互换。
	 vector<int> v5(5, 20);
	 vector<int> v6(10, 40);
	 printVectorInt(v5);
	 printVectorInt(v6);
	 v5.swap(v6);
	 printVectorInt(v5);
	 printVectorInt(v6);
	 }

        运行效果:

 


         3、vector大小操作

size();//返回容器中元素的个数
empty();//判断容器是否为空
resize(int num);//重新指定容器的长度为 num, 若容器变长, 则以默认值填充新位
//置。 如果容器变短, 则末尾超出容器长度的元素被删除。
resize(int num, elem);//重新指定容器的长度为 num, 若容器变长, 则以 elem 值填
//充新位置。 如果容器变短, 则末尾超出容器长>度的元素被删除。
capacity();//容器的容量
reserve(int len);//容器预留 len 个元素长度, 预留位置不初始化, 元素不可访问。

         🌰1

void printVectorInt(vector<int>& v)
 {
	 for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
//v.begin()和v.end()可以看作是指向头尾的指针
		 {
		 cout << *it << " ";
		 }
	 cout << endl;
 }

void test02()
 { vector<int> v;
 v.push_back(10);
 v.push_back(20);
 v.push_back(30);
 v.push_back(40);

 if (v.empty())
 {
	 cout << "v容器为空" << endl;
	 }
 else
 {
	 cout << "容器非空" << endl;
	 cout << "size = " << v.size() << endl;
	 cout << "capacity = " << v.capacity() << endl;
	 //容量 >= size
		 }

 printVectorInt(v);//10 20 30 40
 //resize(int num);//重新指定容器的长度为num
 //多出的部分 自动补0
 v.resize(8);
 printVectorInt(v);//10 20 30 40 0 0 0 0

 //resize(int num, elem);//重新指定容器的长度为num,
 //若容器变长,则以elem值填充
 v.resize(10, 5);
 printVectorInt(v);//10 20 30 40 0 0 0 0 5 5

 v.resize(2);
 printVectorInt(v);//10 20
 }

        运行效果:

         🌰2(resize 作用的容器的大小 不会更改容器的容量)


void test03()
 {
	 vector<int> v;
	 v.push_back(10);
	 v.push_back(20);
	 v.push_back(30);
	 v.push_back(40); 
	 v.push_back(50);
	 v.push_back(60);
	
		 cout << "size = " << v.size() << endl;
	 cout << "capactiy = " << v.capacity() << endl;
	 printVectorInt(v);
	
		 cout << "‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐" << endl;
	 v.resize(2);
	 cout << "size = " << v.size() << endl;
	 cout << "capactiy = " << v.capacity() << endl;
	 printVectorInt(v);
	 }

         运行效果:

 


        4、使用resize swap收缩容器的容量(难点)

        在C++中,vector是一种动态数组容器。当元素个数超过容器当前容量时,会自动分配更多的内存来存储元素。但是,当容器中元素个数减少时,vector并不会自动收缩内存,而是会保留之前分配的内存空间,浪费了内存资源。

        为了解决这个问题,可以使用resize()和swap()函数来收缩容器的容量。

        resize()函数可以用来改变容器的大小,它有两个重载版本:

  1. resize(n):将容器的大小改为n,如果n小于容器当前大小,则会删除超出n的元素;如果n大于容器当前大小,则会在容器末尾添加默认值的元素,比如int类型的默认值为0。

  2. resize(n, value):将容器的大小改为n,如果n小于容器当前大小,则会删除超出n的元素;如果n大于容器当前大小,则会在容器末尾添加value值的元素。

        使用resize()函数可以有效地收缩容器的大小,但是它并不能释放容器的内存空间。为了释放内存空间,可以使用swap()函数。

        swap()函数可以交换两个容器的元素,使用swap()函数可以将一个空的vector容器和另一个容器交换,从而释放空的容器之前占用的内存空间。

        🌰

void test04()
 {
	 vector<int> v;
	 for (int i = 0; i < 1000; i++)
		 {
		 v.push_back(i);
		 }
	 cout << "size = " << v.size() << endl;//1000
	 cout << "capactiy = " << v.capacity() << endl;//1066
	
		 //使用reszie将空间 置成10个元素(可以吗?)
		 v.resize(10);//不能修改容量 只能修改size
	 cout << "size = " << v.size() << endl;//10
	 cout << "capactiy = " << v.capacity() << endl;//1066
	
		 //使用swap收缩容器的容量
		 vector<int>(v).swap(v);
	
		 cout << "size = " << v.size() << endl;//10
	 cout << "capactiy = " << v.capacity() << endl;//10
	 }

        运行效果:

         一图让你了解~

 


        5、reserve预留空间大小

        🌰

//reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问
 void test05()
 {
	 vector<int> v;
	 
		//一次性 给够空间 叫空间预留
	 v.reserve(1000);//预留空间 1000个元素
		int* p = NULL;
	 int count = 0;
	 for (int i = 0; i < 1000; i++)
		 {
		 v.push_back(i);
		 if (p != &v[0])
			 {
			 count++;
			 p = &v[0];
			 }
		 }
	 cout << "重新另寻空间次数:" << count << endl; 
}

        运行效果:

        如果没有:v.reserve(1000); 结果为11
        如果有:v.reserve(1000); 结果为1

 


        6、数据的存取

at(int idx); //返回索引 idx 所指的数据, 如果 idx 越界, 抛出 out_of_range 异
常。
operator[];//返回索引 idx 所指的数据, 越界时, 运行直接报错
front();//返回容器中第一个数据元素
back();//返回容器中最后一个数据元素

        🌰

void test06()
 {
	 vector<int> v;
	 v.push_back(10);
	 v.push_back(20);
	 v.push_back(30);
	 v.push_back(40);
	
		 printVectorInt(v);//10 20 30 40
	 cout << v[2] << endl;//30
	 cout << v.at(2) << endl;//30
	 //[] 越界 不抛出异常
		 //at 越界 抛出异常
		
		 cout << "front = " << v.front() << endl;//10
	 cout << "back = " << v.back() << endl;//40
	 }

            运行效果:

 


        7、插入和删除

insert(const_iterator pos, int count,ele);//迭代器指向位置 pos 插入 count个元素 ele.
push_back(ele); //尾部插入元素 ele
pop_back();//删除最后一个元素
erase(const_iterator start, const_iterator end);//删除迭代器从 start 到 end 之间的元素
erase(const_iterator pos);//删除迭代器指向的元素
clear();//删除容器中所有元素

        🌰

void test07()
 {
	 vector<int> v;
	 v.push_back(10);
	 v.push_back(20);
	 v.push_back(30);
	 v.push_back(40);
	 printVectorInt(v);//10 20 30 40
	
		 //insert(const_iterator pos, int count,ele);
		 //迭代器指向位置pos插入count个元素ele.
		 v.insert(v.begin() + 2, 3, 100);
	 printVectorInt(v);//10 20 100 100 100 30 40
	
		 //尾部删除:pop_back();//删除最后一个元素
		 v.pop_back();//将40删除了
	 printVectorInt(v);//10 20 100 100 100 30
	
		 //erase(const_iterator start, const_iterator end);
		 //删除迭代器从start到end之间的元素
		 v.erase(v.begin() + 2, v.end()-1);
	 printVectorInt(v);//10 20 30
	
		 //erase(const_iterator pos);//删除迭代器指向的元素
		 v.erase(v.begin() + 1);//删除20的位置
	 printVectorInt(v);//10 30
	
		 cout << "size = " << v.size() << ", capacity = " << v.capacity() << endl;
	
		 //clear();//删除容器中所有元素
		 v.clear();
	 printVectorInt(v);//啥也没有
	 cout << "size = " << v.size() << ", capacity = " << v.capacity() << endl;
	 }

        运行效果:

 


                感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!  

                                 

                                                                 给个三连再走嘛~      

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

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

相关文章

亚马逊自动下单软件是怎么操作的?

如果需要亚马逊自动下单软件&#xff0c;那么首选肯定是亚马逊鲲鹏系统&#xff0c;亚马逊鲲鹏系统是一款模拟真人进行全自动化操作的软件&#xff0c;可以注册亚马逊买家号、养号、自动下单留评等&#xff0c;功能非常的齐全。 要进行下单&#xff0c;那么首先我们就需要有一批…

司空见惯 - Feasycom公司介绍(飞易通)

网址&#xff1a; Feasycom IOT Modules Feasycom 是一家专注于物联网产品和服务研发的公司。他们专注于蓝牙模块、Wi-Fi 和 LoRa 技术。Feasycom 为物联网连接提供一站式解决方案&#xff0c;提供自己的蓝牙和 Wi-Fi 协议栈实施方案。他们拥有一系列产品&#xff0c;包括可在…

剑指Offer07.重建二叉树 C++

1、题目描述 输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 示例1&#xff1a; Input: preorder [3,9,20,15,7], inorder [9,3,15,20,7] Output: [3,9,20,null,null,15,7] …

2023年国赛 高教社杯数学建模思路 - 案例:感知机原理剖析及实现

文章目录 1 感知机的直观理解2 感知机的数学角度3 代码实现 4 建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法&#xff0c;其…

Gin框架入门

介绍 Gin是一个golang的微框架&#xff0c;封装比较优雅&#xff0c;API友好&#xff0c;源码注释比较明确&#xff0c;具有快速灵活&#xff0c;容错方便等特点 对于golang而言&#xff0c;web框架的依赖要远比Python&#xff0c;Java之类的要小。自身的net/http足够简单&…

国标视频云服务EasyGBS国标平台进行内网映射两个公网设备配置的详细步骤

国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入&#xff0c;并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强&#xff0c;支持将接入的视频流进行全终端、全平台分发&#xff0c;分发的视频…

无涯教程-PHP - 标量函数声明

在PHP 7中&#xff0c;引入了一个新函数&#xff0c;即标量类型声明。标量类型声明有两个选项- Coercive - 强制性是默认模式。Strict - 严格模式必须明确提示。 可以使用上述模式强制执行以下类型的函数参数- intfloatbooleanstringinterfacesarraycallable 强制模…

686. 重复叠加字符串匹配

686. 重复叠加字符串匹配 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a;__686重复叠加字符串匹配__暴力解法__直接调用函数__686重复叠加字符串匹配__KMP算法 原题链接&#xff1a; 686. 重复叠加字符串匹配 https://leetcode.cn/prob…

vue 简单实验 自定义组件 综合应用 传参数 循环

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"todo-list-app"><ol><!--现在我们为每个 todo-item 提供 todo 对象todo 对象是变量&#xff0c;即其内容可以是动态的。…

Python Pandas 提取csv数据再合并

文章目录 需求思路&#xff1a;步骤伪代码 需求 从不同的csv文件中提取相同的列&#xff0c;然后合并成一个csv 假设有这样一张csv&#xff0c; column A&#xff0c; B&#xff0c; C, D 的数据分别来自a.csv, b.csv, c.csv, d.csv指定的某一列数据。 Title 列的Items是之前…

【自动驾驶】TI SK-TDA4VM 开发板上电调试,AI Demo运行

1. 设备清单 TDA4VM Edge AI 入门套件【略】USB 摄像头(任何符合 V4L2 标准的 1MP/2MP 摄像头,例如:罗技 C270/C920/C922)全高清 eDP/HDMI 显示屏最低 16GB 高性能 SD 卡连接到互联网的 100Base-T 以太网电缆【略】UART电缆外部电源或电源附件要求: 标称输出电压:5-20VDC…

无线路由器实现网络接入

目录 简介 1. 常见的接人互联网方式及设备 2.常见的接入互联网方式比较 2.2接入互联网设备 简介 随着IT技术的不断发展&#xff0c;一些中小型企业和家庭用户对网络带宽的需求越来越高。而传统的接入互联网方式虽然价格便宜&#xff0c;但是其稳定性受线路等其他因素影响。因…

轻松搭建远程Node.js服务端,让你的应用在公共网络中畅行无阻!

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

「2024」预备研究生mem-带绝对值的一次与二次不等式方程和不等式图像

一、带绝对值的一次与二次不等式&方程和不等式图像 代入特殊值 带绝对值的方程不等式&#xff1a; 二、课后题

solidity0.8.0的应用案例9:代理合约

代码由OpenZeppelin的Proxy合约简化而来。 代理模式 Solidity合约部署在链上之后,代码是不可变的(immutable)。这样既有优点,也有缺点: 优点:安全,用户知道会发生什么(大部分时候)。坏处:就算合约中存在bug,也不能修改或升级,只能部署新合约。但是新合约的地址与…

Mesa 23.2 开源图形栈现已可供下载

导读作为 Mesa 23 系列的第二个重要版本&#xff0c;Mesa 23.2 开源图形栈现已可供下载&#xff0c;它为 AMD GPU 的 RADV Vulkan 驱动程序带来了新功能&#xff0c;改进了 Linux 游戏&#xff0c;并新增了 Asahi 功能。 Mesa 23.2 的亮点包括 Asahi 上的 OpenGL 3.1 和 OpenGL…

GC面临的困境,JVM是如何解决跨代引用的?

本文已收录至GitHub&#xff0c;推荐阅读 &#x1f449; Java随想录 微信公众号&#xff1a;Java随想录 原创不易&#xff0c;注重版权。转载请注明原作者和原文链接 文章目录 跨代引用问题记忆集卡表写屏障写屏障的伪共享问题 前面我们讲了可达性分析和根节点枚举&#xff0c…

你真的了解四种内部类吗

作者简介&#xff1a; zoro-1&#xff0c;目前大一&#xff0c;正在学习Java&#xff0c;数据结构等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 内部类 实例内部类注意事项 静态内部类注意事项 局…

联发科雄起,生成式AI将可在手机本地运行,天玑9300“大放异彩”

据报道&#xff0c;高通和联发科都计划在即将推出的旗舰手机上集成设备端生成式人工智能功能。这意味着用户将能够在手机上使用先进的语言模型技术。 高通选择与Meta合作&#xff0c;将其最新的语言模型Llama 2&#xff08;LLM&#xff09;引入他们的设备&#xff0c;而联发科则…

TCP最大连接数问题总结

最大TCP连接数量限制有&#xff1a;可用端口号数量、文件描述符数量、线程、内存、CPU等。每个TCP连接都需要以下资源&#xff0c;如图所示&#xff1a; 1、可用端口号限制 Q&#xff1a;一台主机可以有多少端口号&#xff1f;端口号与TCP连接&#xff1f;是否能修改&#x…