STL常用容器(vector容器)---C++

STL常用容器目录

  • 2.vector容器
    • 2.1 vector基本概念
    • 2.2 vector构造函数
    • 2.3 vector赋值操作
    • 2.4 vector容量和大小
    • 2.5 vector插入和删除
    • 2.6 vector数据存取
    • 2.7 vector互换容器
      • 2.7.1 vector互换容器收缩内存空间
    • 2.8 vector预留空间

在这里插入图片描述

2.vector容器

2.1 vector基本概念

功能:

  • vector数据结构和数组非常相似,也称为单端数组

vector与普通数组区别:

  • 不同之处在于数组是静态空间,而vector可以动态扩展

动态扩展:

  • 并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间。
  • vector容器的迭代器是支持随机访问的迭代器。
    在这里插入图片描述
    里面是vector的迭代器,如:begin()、end()、rend()-指向第一个元素的前一个位置、front()-返回第一个元素、back()-返回最后一个元素、insert()-插入一个元素、rbegin()-返回一个指向向量最后一个元素的反向迭代器、push_back()和pop_back()-尾插和尾删。

2.2 vector构造函数

功能描述:

  • 创建vector容器
  • 头文件:#include

函数原型:

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

示例:

void printVector(vector<int>& v) {for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;
}
void test01()
{vector<int> v1; //无参构造for (int i = 0; i < 10; i++){v1.push_back(i);}printVector(v1);//将v[begin(), end())区间中的元素拷贝给本身vector<int> v2(v1.begin(), v1.end());printVector(v2);//构造函数将10个100拷贝给本身vector<int> v3(10, 100);printVector(v3);vector<int> v4(v3);//拷贝构造printVector(v4);
}

在这里插入图片描述

2.3 vector赋值操作

函数原型:

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

示例:

void printVector(vector<int>& v) {for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;
}
void test02()
{vector<int> v1; //无参构造for (int i = 0; i < 10; i++){v1.push_back(i);}printVector(v1);vector<int> v2=v1;//等号重载printVector(v2);//将v[begin(), end())区间中的元素拷贝给本身vector<int> v3;v3.assign(v1.begin(), v1.end());printVector(v3);//构造函数将10个100拷贝给本身vector<int> v4;v4.assign(10, 99);printVector(v4);
}

在这里插入图片描述

2.4 vector容量和大小

功能描述:

  • 对vector容器的容量和大小操作

函数原型:

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

示例:

void printVector(vector<int>& v) {for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;
}
void test03()
{vector<int> v1; //无参构造for (int i = 0; i < 10; i++){v1.push_back(i);}printVector(v1);if (v1.empty()){cout << "v1为空" << endl;}else{cout << "v1不为空" << endl;cout << "v1的容量 = " << v1.capacity() << endl;//容量>=大小cout << "v1的大小 = " << v1.size() << endl;}//resize 重新指定大小 ,若指定的更大,默认用0填充新位置,可以利用重载版本替换默认填充v1.resize(15, 10);printVector(v1);//resize 重新指定大小 ,若指定的更小,超出部分元素被删除v1.resize(5);printVector(v1);
}

在这里插入图片描述
可见,容量开辟的会比实际所需大小大一点。

总结:

  • 判断是否为空 — empty
  • 返回元素个数 — size
  • 返回容器容量 — capacity
  • 重新指定大小 — resize

2.5 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(); //删除容器中所有元素
  • 注: 此处的位置均为迭代器指向的位置。

示例:

void printVector(vector<int>& v) {for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;
}
void test04()
{vector<int> v1; //无参构造for (int i = 1; i < 6; i++){//尾插v1.push_back(i*10);}printVector(v1);//尾删v1.pop_back();printVector(v1);//插入v1.insert(v1.begin(), 9);//从第一个元素位置开始,插入9printVector(v1);v1.insert(v1.begin(), 2, 99);//从第一个元素位置开始,插入2个99printVector(v1);//删除v1.erase(v1.begin());//只删除第一个元素printVector(v1);//清空v1.erase(v1.begin(), v1.end());//删除从begin指向的位置到end指向的位置之间内容v1.clear();//效果同上,清空printVector(v1);
}

在这里插入图片描述
总结

  • 尾插 — push_back
  • 尾删 — pop_back
  • 插入 — insert (位置迭代器)
  • 删除 — erase (位置迭代器)
  • 清空 — clear

2.6 vector数据存取

函数原型:

  • at(int idx); //返回索引 idx所指的数据
  • operator[]; //返回[]所指的数据
  • front(); //返回容器中第一个数据元素
  • back(); //返回容器中最后一个数据元素

示例:

void printVector(vector<int>& v) {for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;
}
void test05()
{vector<int> v1; //无参构造for (int i = 1; i < 6; i++){//尾插v1.push_back(i*10);}printVector(v1);for (int i = 0; i < v1.size(); i++){cout << v1.at(i) << " ";}cout << endl;cout << "v1的第一个元素为: " << v1.front() << endl;cout << "v1的最后一个元素为: " << v1.back() << endl;
}

在这里插入图片描述
总结:

  • 除了用迭代器获取vector容器中元素,[ ]和at也可以
  • front返回容器第一个元素
  • back返回容器最后一个元素

2.7 vector互换容器

功能描述:

  • 实现两个容器内元素进行互换

函数原型:

  • swap(vec); // 将vec与本身的元素互换

示例:

void printVector(vector<int>& v) {	for (int i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl; 
}
void test06()
{vector<int> v1; //无参构造for (int i = 1; i < 10; i++){//尾插v1.push_back(i*10);}printVector(v1);vector<int> v2; //无参构造for (int i = 1; i < 10; i++){//尾插v2.push_back(i *9);}printVector(v2);//互换容器cout << "互换后:" << endl;v1.swap(v2);printVector(v1);printVector(v2);
}

在这里插入图片描述

2.7.1 vector互换容器收缩内存空间

  • 巧用swap收缩内存
    示例:
void test07()
{vector<int> v;for (int i = 0; i < 100000; i++) {v.push_back(i);}cout << "v的容量为:" << v.capacity() << endl;cout << "v的大小为:" << v.size() << endl;v.resize(3);//cout << "v的容量为:" << v.capacity() << endl;cout << "v的大小为:" << v.size() << endl;//收缩内存vector<int>(v).swap(v); //匿名对象:执行完当前行就回收cout << "v的容量为:" << v.capacity() << endl;cout << "v的大小为:" << v.size() << endl;
}

在这里插入图片描述
析:vector(v).swap(v);
其中vector(v)表示创建一个匿名对象,其大小和容量按照v的实际大小进行初始化(即为什么交换后v的大小和容量都为3)。

总结:swap可以使两个容器互换,可以达到实用的收缩内存效果

2.8 vector预留空间

功能描述:

  • 减少vector在动态扩展容量时的扩展次数.

函数原型:

  • reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。(resize区分)

示例:

void test08()
{vector<int> v;int num = 0;//统计空间开辟次数int* p = NULL;for (int i = 0; i < 100000; i++) {v.push_back(i);//因为空间开辟一次首元素地址就会改变一次if (p != &v[0]){p = &v[0];num++;}}cout << "v的容量为:" << v.capacity() << endl;cout << "v的大小为:" << v.size() << endl;cout << "空间开辟了" << num << "次" << endl;
}

在这里插入图片描述
可见,对于大空间vector的开辟不是一下子就开辟的,他是一个逐步个过程。
当提前预置空间容量时,就只会开辟一次。如下:
在这里插入图片描述
总结:如果数据量较大,可以一开始利用reserve预留空间.

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

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

相关文章

文献阅读:Large Language Models are Null-Shot Learners

文献阅读&#xff1a;Large Language Models are Null-Shot Learners 1. 文章简介2. 方法介绍3. 实验考察 & 结论 1. 基础实验 1. 实验设计2. 实验结果 2. 消融实验 1. 小模型上的有效性2. ∅CoT Prompting3. 位置影响4. 组成内容 4. 总结 & 思考 文献链接&#xff1…

计算机网络:思科实验【3-集线器与交换机的区别、交换机的自学习算法】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;Cisco Packet Tracer实验 本文对应的实验报告源文件请关注微信公众号程序员刘同学&#xff0c;回复思科获取下载链接。 实验目的实验环境实验内容集线器与交换机的区别交换机的自学习算法…

Cubase学习:Cubase 12常用快捷键

按键盘上的上下箭头就可以让选中的音符向上或向下移动 数字0键: 停止 Ctrl+数字 0 键: 新建视图层 Alt+数字0 键: 重新设置视图层 小数点键: 播放指针回零点 数字1 键: 左定位指针 数字 2 键: 右定位指针 数字3 键--数字9键: 分别控制 3--9 的7个定位标志 Alt+数字1 键--数字9键…

自定义神经网络四之编写自定义神经网络

文章目录 前言神经网络组件代码整体的项目结构Tensor张量Layers层NeuralNet神经网络Loss损失函数Optim优化器data数据处理train训练 神经网络解决实际问题实际问题训练和推理代码 总结 前言 自定义神经网络一之Tensor和神经网络 自定义神经网络二之模型训练推理 自定义神经网络…

【Android】View 与 ViewGroup

View 是 Android 所有控件的基类&#xff0c;我们平常所用的 TextView 和 ImageView 都是继承自 View 的&#xff0c;源码如下&#xff1a; public class TextView extends View implements ViewTreeObserver.OnPreDrawListener {... }public class ImageView extends View {.…

【Java程序设计】【C00297】基于Springboot的养老院管理系统(有论文)

基于Springboot的养老院管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的养老院管理系统设计与实现&#xff0c;本系统有管理员以及用户二种角色&#xff1b; 系统整体功能有&#xff1a;老人管理、字典表…

第八章 堆

第八章 堆 文章目录 第八章 堆0. 前情概述1. 堆(Heap)的核心概述1.1 堆的内存细分 2. 设置堆内存大小与OOM2.1 对空间大小的设置2.2 OutOfMemory举例 3. 年轻代与老年代4. 图解对象分配过程5. Minor GC、Major GC与Full GC5.1 最简单的分代式GC策略的触发条件 6. 堆空间分代思想…

【黑马程序员】3、TypeScript常用类型_黑马程序员前端TypeScript教程,TypeScript零基础入门到实战全套教程

课程地址&#xff1a;【黑马程序员前端TypeScript教程&#xff0c;TypeScript零基础入门到实战全套教程】 https://www.bilibili.com/video/BV14Z4y1u7pi/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 3、TypeScript常用类型 3.1 类型注解 …

SAM轻量化的终点竟然是RepViT + SAM

本文首发&#xff1a;AIWalker&#xff0c;欢迎关注~~ 殊途同归&#xff01;SAM轻量化的终点竟然是RepViT SAM&#xff0c;移动端速度可达38.7fps。 对于 2023 年的计算机视觉领域来说&#xff0c;「分割一切」&#xff08;Segment Anything Model&#xff09;是备受关注的一项…

安装 Ubuntu 22.04.3 和 docker

文章目录 一、安装 Ubuntu 22.04.31. 简介2. 下载地址3. 系统安装4. 系统配置 二、安装 Docker1. 安装 docker2. 安装 docker compose3. 配置 docker 一、安装 Ubuntu 22.04.3 1. 简介 Ubuntu 22.04.3 是Linux操作系统的一个版本。LTS 版本支持周期到2032年。 系统要求双核 C…

了解 JavaScript 中的重放攻击和复现攻击

在网络安全领域&#xff0c;重放攻击&#xff08;Replay Attack&#xff09;和复现攻击&#xff08;Playback Attack&#xff09;是一些可能导致安全漏洞的攻击形式。这两种攻击类型涉及在通信过程中再次发送已经捕获的数据&#xff0c;以达到欺骗系统的目的。本文将介绍 JavaS…

高并发下如何保证数据的一致性

拿转账来说&#xff0c;在高并发下场景下&#xff0c;对账户余额操作的一致性&#xff0c;是非常重要的。如果代码写的时候没考虑并发一致性&#xff0c;就会导致公司亏损。所以本篇主要聊一下&#xff0c;如何在并发场景下&#xff0c;保证账户余额的一致性。 扣款流程 伪代码…

常用实验室器皿耐硝酸盐酸进口PFA材质容量瓶螺纹盖密封效果好

PFA容量瓶规格参考&#xff1a;10ml、25ml、50ml、100ml、250ml、500ml、1000ml。 别名可溶性聚四氟乙烯容量瓶、特氟龙容量瓶。常用于ICP-MS、ICP-OES等痕量分析以及同位素分析等实验&#xff0c;也可在地质、电子化学品、半导体分析测试、疾控中心、制药厂、环境检测中心等机…

【Linux基础】vim、常用指令、组管理和组权限

Linux基础 1、目录结构2、vi和vim3、常用指令运行级别找回密码帮助指令时间日期指令搜索查找文件目录操作磁盘管理指令压缩和解压缩 4、组管理和组权限用户操作指令权限 1、目录结构 Linux的文件系统是采用级层式的树状目录结构&#xff0c;在此结构中的最上层是根目录“/”&a…

Repeater:创建大量类似项

Repeater 类型用于创建大量类似项。与其它视图类型一样&#xff0c;Repeater有一个model和一个delegate。 首次创建Repeater时&#xff0c;会创建其所有delegate项。若存在大量delegate项&#xff0c;并且并非所有项都必须同时可见&#xff0c;则可能会降低效率。 有2种方式可…

C语言第三十弹---自定义类型:结构体(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 结构体 1、结构体类型的声明 1.1、结构体回顾 1.1.1、结构的声明 1.1.2、结构体变量的创建和初始化 1.2、结构的特殊声明 1.3、结构的自引用 2、结构体内存…

未来已来:数字孪生与智慧园区的深度融合

目录 一、数字孪生技术的概述 二、智慧园区的概念和发展 三、数字孪生与智慧园区的深度融合 四、数字孪生与智慧园区的未来展望 五、结论 随着科技的飞速发展&#xff0c;我们正处在一个日新月异的时代。数字孪生技术作为新兴的前沿科技&#xff0c;已经引起了全球范围内的…

【人脸朝向识别与分类预测】基于PNN神经网络

课题名称&#xff1a;基于PNN神经网络的人脸朝向识别分类 版本日期&#xff1a;2024-02-20 运行方式&#xff1a;直接运行PNN0503.m文件 代码获取方式&#xff1a;私信博主或 QQ:491052175 模型描述&#xff1a; 采集到一组人脸朝向不同角度时的图像&#xff0c;图像来自不…

奇异递归模板模式应用6-类模板enable_shared_from_this

异步编程中存在一种场景&#xff0c;需要在类中将该类的对象注册到某个回调类或函数中&#xff0c;不能简单地将this传递给回调类中&#xff0c;很可能因为回调时该对象不存在而导致野指针访问&#xff08;也有可能在析构函数解注册时被回调&#xff0c;造成对象不完整&#xf…

[VNCTF2024]-Web:CheckIn解析

查看网页 一款很经典的游戏&#xff0c;而且是用js写的 在调试器里面我们可以看见&#xff0c;如果游戏通关的话&#xff0c;它会进行一系列操作&#xff0c;包括使用console.log(_0x3d9d[0]);输出_0x3d9d[0]到控制台&#xff0c;那我们就直接在点击在控制台求出它的值