C++vector容器

3.3.2vector容器

vector的数据安排及操作方式,与array非常相似,两者唯一差别在于空间的运用的灵活性。Array是静态控件,一旦配置了就不能改变,要换大一点或者小一点的空间,可以,一切琐碎得由自己来,首先配置一块新的空间,然后将旧空间的数据办网新空间,在释放原来的空间。Vector时动态空间,随着元素的加入,他的内部机制就会自动阔充空间以容纳新元素。因此vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必害怕空间不足而一开始就要求一个大块头的array了。

//vector容器遍历
void test14() {//1.构造一个vector对象	通过vector无参构造,构造空vector容器vector<int> v;//2.添加若干个元素v.push_back(10);v.push_back(20);v.push_back(30);//3.迭代器:使用普通指针 一次指向vector中每一个元素//begin():获取到的是vector容器中的首元素的地址//end():获取到的是vector容器中的最后一位元素的下一位的指针/*vector<int>::iterator it = v.begin();cout << *it << endl;it++;cout << *it << endl;it++;cout << *it << endl;*/for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {//直接输出指针指向元素//cout << *it << endl;//可以通过指针,修改元素if (*it == 20) {*it = 200;}}//使用迭代器遍历vector容器for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << endl;}//使用迭代器遍历容器的时候可以缩写//一次将vector容器的每一个元素,给element赋值for (int ele : v) {if (ele == 200) {ele = 2000;}}for (int ele : v) {cout << ele << endl;}for (int& ele : v) {if (ele == 200) {ele = 2000;}}for (int ele : v) {cout << ele << endl;}int a = 10;int& b = a;//想通过b修改a加&b = 100;
}int main() {test14();system("pause");return 0;//倒序遍历vectorfor (vector<int>::iterator it = v.end(); it != v.begin(); ) {it--;cout << *it << endl;}
}

vector构造函数

vector<T> v;//采用模板实现类实现,默认构造函数
vector(v.begin(), v.end());//将v[begin(), end())区间中的元素拷贝给本身
vector(n, elem);//构造函数将n个elem拷贝给本身
vector(const vector &vec);//拷贝构造函数。//例子 使用第二个构造函数我们可以...
int arr[] = {2,3,4,1,9};
vector<int> v1(arr, arr + sizeof(arr)/sizeof(int));
//vector的构造函数
void test15() {//1.无参构造vector<int> v1 = vector<int>();//同vector<int> v1;//2.vector(n, ele)//	使用n个ele填充容器vector<int> v2(10, 5);printVector(v2);//3.vector(const vector& v).拷贝构造函数//4.vector(v.begin(),v.end())宝座不包右vector<int> v3(v2.begin(), v2.begin() + 5);printVector(v3);int array[] = { 1,2,3,4,5 };vector<int> v4(array, array + 3);printVector(v4);}

vector的常用赋值

assign(beg, end);//将[beg,end)区间中的数据拷贝赋值给本身
assign(n, elem);//将n个elem拷贝赋值给本身
vector& operator=const vector &vec);//重载等号操作符
swap(vec);//将vec与本身的元素互换
//vector的赋值函数
void test16() {//assign(beg, end);//将[beg,end)区间中的数据拷贝赋值给本身//assign(n, elem);//将n个elem拷贝赋值给本身//vector& operator=(const vector& vec);//重载等号操作符//swap(vec);//将vec与本身的元素互换int arr[] = { 1,2,3,4,5,6,7,8,9,0 };//vector对象的构建vector<int> v1;v1.assign(arr, arr + 6);printVector(v1);//1,2,3,4,5,6,vector<int> v2;v2.assign(5, 10);printVector(v2);//10,10,10,10,10,vector<int> v3;v3 = v2;printVector(v3);//10,10,10,10,10,v1.swap(v2);printVector(v1);//10,10,10,10,10,printVector(v2);//1,2,3,4,5,6,
}

vector的大小操作

size();//返回容器中的元素的个数
empty();//判断容器是否为空
resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num, elem);//重新指定容器的长度为num,若容器变长,则以elem填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
capacity();//容器的容量
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问
//vector的大小操作
void test17() {//size();//返回容器中的元素的个数//empty();//判断容器是否为空//resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。//resize(int num, elem);//重新指定容器的长度为num,若容器变长,则以elem填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。//capacity();//容器的容量//reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问vector<int> v(10, 5);//返回容器中由多少个元素cout << "size = " << v.size() << endl;//判断容器是否为空cout << "empty = " << v.empty() << endl;//返回容器的容量cout << "capacity =" << v.capacity() << endl;//重新指定容器的长度,如果新的长度小于原来的长度,保留容器中的前指定数量的元素,后面的元素不可见v.resize(5);cout << "size = " << v.size() << endl;//如果新长度大于原来的长度,在后面填充默认元素v.resize(15);cout << "size = " << v.size() << endl;printVector(v);//后面填充指定元素v.resize(20, 9);
}

vector的数据存取操作

at(int idx);//返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
operator[];//返回索引idx所指的数据,越界时,运行直接报错
front();//返回容器中第一个数据元素
back();//返回容器中最后一个数据元素
//vector的数据存取操作
void test18() {//at(int idx);//返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。//operator[];//返回索引idx所指的数据,越界时,运行直接报错//front();//返回容器中第一个数据元素//back();//返回容器中最后一个数据元素int array[] = { 1,2,3,4,5,6,7,8,9,10 };vector<int> v(array, array + (sizeof(array) / sizeof(int)));//int& ele = v.at(3);cout << ele << endl;ele = 40;printVector(v);//int& e = v[5];cout << e << endl;e = 60;printVector(v);cout << v.front() << endl;cout << v.back() << endl;
}

vector插入和删除操作

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 test19() {//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();//删除容器中所有元素//通过数组构建vectorint array[] = { 1,2,3,4,5,6,7,8,9,10 };vector<int> v(array, array + (sizeof(array) / sizeof(int)));//需求:希望在第3位插入元素  v.insert(v.begin() + 3, 5, 0);//在第3位插入5个0printVector(v);//1,2,3,0,0,0,0,0,4,5,6,7,8,9,10,v.push_back(20);//在末尾插入20printVector(v);//1,2,3,0,0,0,0,0,4,5,6,7,8,9,10,20,
}

利用swap函数实现vector容器收缩内存空间


//vector小案例:利用swap收缩空间
void test20() {//capacity:在内存上开辟了多少个空间//size:实际容器中存放的元素的数量//capacity>=sizevector<int> v;for (int i = 0; i < 10000; i++) {v.push_back(i);}cout << "size = " << v.size() << endl;//10000cout << "capacity = " << v.capacity() << endl;//12138//使用resize更改容器的元素数量v.resize(10);cout << "size = " << v.size() << endl;//10cout << "capacity = " << v.capacity() << endl;//12138vector<int>(v).swap(v);cout << "size = " << v.size() << endl;//10                                                                                                                                                                              cout << "capacity = " << v.capacity() << endl;//10#if 0{vector<int> v2(v);cout << "v2 size =" << v2.size() << endl;//10cout << "v2 capacity =" << v2.capacity() << endl;//10v2.swap(v);cout << "size = " << v.size() << endl;//10cout << "capacity = " << v.capacity() << endl;//10cout << "v2 size =" << v2.size() << endl;//10cout << "v2 capacity =" << v2.capacity() << endl;//12138}//放代码段里   v2用完直接释放   瘦身效果
#endif
}

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

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

相关文章

打造实用Python学生管理系统:设计与实现

引言 在信息化教育管理的背景下&#xff0c;一个高效、便捷的学生管理系统对于提升教学管理效率具有重大意义。Python作为一种功能强大且易读易写的编程语言&#xff0c;非常适合用于开发此类系统。本文将探讨如何使用Python设计并实现一个基础的学生管理系统。 一、系统需求…

MYSQL基础问题

一&#xff0e;DBMS 是什么 DBMS&#xff08;Database Management System&#xff09;,数据库管理系统&#xff0c;是一种操纵和管理 数据库的大型软件&#xff0c;用于建立、使用和维护数据库。对数据库进行统一的管理和 控制&#xff0c;以保证数据库的安全性和完整性。 二…

Leetcode—33. 搜索旋转排序数组【中等】

2024每日刷题&#xff08;一百一&#xff09; Leetcode—33. 搜索旋转排序数组 实现代码 class Solution { public:int search(vector<int>& nums, int target) {int n nums.size();int l 0, r n - 1;while(l < r) {int m l (r - l) / 2;if(nums[m] targe…

将结构体中的浮点数数据提取出来并发送至串口屏显示

1、由于项目中定义了一个结构体如下&#xff1a; typedef struct {uint16_t number;uint16_t LocationData;uint16_t PersonData; // _calendar_obj calendar; // uint16_t LiuLiang_Value;float LiuLiang_Value;_calendar_obj calendar_records; } Frame; 现需要将其中的flo…

STM32CAN2进入bus off 模式

工作遇到的问题记录 无人机CAN2整个进不了中断&#xff0c;通过查看寄存器判定出CAN节点进入了bus off mode 为何进入bus off &#xff0c;最后通过示波器看到整个CAN2总线波形就不对&#xff0c;总线出现了错误 Busoff的产生是一定是因为节点自身识别到自己发送错误&#xff…

基于SpringBoot Vue学生成绩管理系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

带你了解JAVA中的AQS介绍(AbstractQueuedSynchronizer)

一、AQS 介绍 AQS的全称为&#xff08;AbstractQueuedSynchronizer&#xff09;&#xff0c;这个类在java.util.concurrent.locks包下面。 AQS是一个用来构建锁和同步器的框架&#xff0c;使用AQS能简单且高效地构造出应用广泛的大量的同步器&#xff0c;比如我们提到的Reen…

了解野指针与assert断言 拿捏指针的使用!

目录 1.野指针 野指针的成因&#xff1a; 2.规避野指针 3.assert断言 创作不易&#xff0c;宝子们&#xff01;如果这篇文章对你们有帮助的话&#xff0c;别忘了给个免费的赞哟~ 1.野指针 概念&#xff1a;野指针就是指针指向的位置是不可知的&#xff08;随机的、不正确的…

【安装指南】maven下载、安装与配置详细教程

&#x1f33c;一、概述 maven功能与python的pip类似。 Apache Maven是一个用于软件项目管理和构建的强大工具。它是基于项目对象模型的&#xff0c;用于描述项目的构建配置和依赖关系。以下是一些关键的 Maven 特性和概念&#xff1a; POM&#xff08;Project Object Model&…

【leetcode】完全背包总结

本文内容参考了代码随想录&#xff0c;并进行了自己的总结。 完全背包 关键点 ● 每件物品有若干种状态&#xff1a;不选、选 1 件、选 2 件、…、选 n 件 代码 在代码上&#xff0c;只有重量的遍历方向和 01 背包不一样&#xff1a; for(int i 0; i < nums.length; i…

echarts中绘制3D三维地球

简介 echarts中的三维地球&#xff0c;需要用到世界地图json数据&#xff0c;我把json文件放到我的资源中&#xff0c;有需要的自行下载。 安装插件 // 安装echats npm install echarts --save npm install echarts-gl --save 项目中引用 1&#xff0c;引入安装的echarts…

Three.js学习2:页面引入 Three.js

一、关于 Three.js 的版本 随着页面3D化应用越来越多&#xff0c;近两年 Three.js 处于飞速发展之中。现在 Three.js 几乎每个月都会发布一个新的版本&#xff0c;会增加新的 API&#xff0c;废掉一些旧的功能之类的。 可以从 Three.js 官网 Three.js – JavaScript 3D Libra…

【gcc】webrtc发送侧 基于丢包更新码率

参考大神的分析1 rtt 有问题:网络拥堵,直接下调码率 G:\CDN\rtcCli\m98\src\modules\congestion_controller\goog_cc\send_side_bandwidth_estimation.hRttBasedBackoff RttBasedBackoff rtt_backoff_;class RttBasedBackoff {public:explicit RttBasedBackoff(const WebRtcK…

C#代码添加脚本头

目录 前言 代码展示 前言 创建脚本的时候添加脚本的介绍 代码展示 using System.IO;/// <summary> /// 创建脚本自动添加头注 /// </summary> public class CommentFirst : UnityEditor.AssetModificationProcessor {/// <summary>/// 在资源创建生成.me…

【linux】校招中的“熟悉linux操作系统”一般是指达到什么程度?

这样&#xff0c;你先在网上找一套完整openssh升级方案&#xff08;不是yum或apt的&#xff0c;要源码安装的&#xff09;&#xff0c;然后在虚拟机上反复安装测试&#xff0c;直到把他理解了、背下来。 面试的时候让你简单说说linux命令什么的&#xff0c;你就直接把这个方案…

基于SpringBoot开发的校刊投稿系统[附源码]

基于SpringBoot开发的校刊投稿系统[附源码] &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#x1f…

Nicn的刷题日常之打印菱形

目录 1.题目描述 2.解题思路 3.解题 1.题目描述 用C语言在屏幕上输出以下图案&#xff1a; 2.解题思路 仔细观察图形&#xff0c;可以发现&#xff0c;此图形中是由空格和*按照不同个数的输出组成的。 上三角&#xff1a;先输出空格&#xff0c;后输出*&#xff0c;每…

maven工程的依赖介绍(2023版idea--2024年最全最详细)

搭建maven工程 我们在右上角打开对应的设置结构之后 然后我们进行对应的maven仓库以及路径配置 然后新建项目 然后我们构建系统选择对应的maven就可以啦 maven依赖管理 我们配置对应的依赖文件是针对的pom.xml文件 也就是这个结构&#xff0c;真正的是groupid到version这三个…

【Java】面向小白的Spring Framework注解开发学习笔记

目录 简介 IoC&DI 纯注解实现 定义 Bean Bean 的作用范围和生命周期管理 依赖注入 管理第三方 Bean 为第三方 Bean 注入资源&#xff08;例如数据库连接池&#xff09; AOP 纯注解实现 工作流程 切面示例 切入点表达式示例 通知类型示例 Before&#xff08;…

谷粒商城【成神路】-【3】——三级分类

目录 &#x1f37f;1.查询三级分类 &#x1f9c2;2.前端页面搭建 &#x1f35f;3.添加网关 &#x1f373;4.解决跨域 &#x1f9c7;5.显示分类 &#x1f95e;6.显示复选框 1.查询三级分类 1.controller 直接调用service层的接口 RequestMapping("/list/tree&qu…