vector 的使用(上)

news2024/11/24 11:25:38

1.概念

vector本质是顺序表。它像数组一样,用一块连续的空间对数据进行管理,但又区别于数组,它的空间是根据数据进行动态增容的,并封装了一系列成员变量对数据进行监控,封装成员函数对数据进行操作。

2.区别

vector<char>和string(basic_string<char>)有什么区别呢?

1.string处理的是单向信息,而vector<char>处理的是多向信息。例如存放一个人的身份证号,我们更倾向于用string。

2.string的_str末尾有\0,而vector<char>因为存放的是单个单个的字符,因此没有\0的存储.

3.string因为其处理是单向的信息,因此operator+=有其意义,而vector<char>并没有。

3.vector的构造函数

3.1.默认构造函数(无参数) 

vector<int> a;

3.2.填充构造函数(vector(size_t n ,const value_type& val  = value_type()))

vector<int> a2(18, 9);//创建18个9

 3.3.拷贝构造函数

vector<int> a;  // 无参数构造
a.push_back(1);
a.push_back(2);
a.push_back(3);
a.push_back(4);
vector<int> a1(a); //拷贝构造

3.4.基于迭代器的范围构造(迭代器范围构造都是左闭右开) 

//范围构造;用迭代器构造都是左闭右开!
vector<int> a3(a1.begin(), a1.begin() + 2);//只有 1 2 

4.vector的遍历即元素访问

4.1利用operator[]和size

for (int i = 0; i < a.size(); i++)
{
	cout << a[i] << " ";
}
cout << endl;

4.2利用迭代器

vector<int>::iterator it = a1.begin();
while (it != a1.end())
{
	cout << *it << " ";
	++it;
}
cout << endl;

4.3.利用基于迭代器的范围for

	for (auto& x : a2)
	{
		cout << x << " ";
	}
	cout << endl;

4.4 at函数进行元素访问

vector<int> a(4, 4);
cout << a.at(0);

at函数进行元素访问与operator[]进行访问的区别是at访问失败会抛出异常,而operator[]会直接崩溃. 可以用front和back获取首元素和尾元素.

5.迭代器

与string类似。正向用begin()和end()获取,反向用rbegin()和rend()获取;

6. vector的空间增长问题

上述函数的使用都和string类的相同,值得重新注意的是:resize是改变空间的size,如果变大了会初始化空间,而reserve只是单纯的增长空间容量,并不会初始化空间。

在vs,pj版本的stl下当capacity需要扩容时是按照1.5倍扩容

而在linux的g++下,sgi版本的stl下,当capacity需要扩容的时候是按照2倍扩容。

面试中常常会问按照1.5倍好,还是2倍好?其实选择1.5或者2倍是一种选择,需要考虑到效率和空间利用率两方面的问题:按照2倍扩容,扩容次数少了,效率高了,但是空间利用率可能会低。如果按照1.5倍扩容,扩容次数多了,效率低了,但是可能空间利用率就高了。因此需要看数据量的多少酌情考虑.

7.vector的增删查改

7.1 push_back和pop_back

7.2 find(并不是vector中的,在库函数std的algorithm中)

值得注意的是,因为其有普遍性,因此给他传入的是一个迭代器范围,和要找的变量。如果找到就返回该位置的迭代器,找不到就返回end位置迭代器。(注意:只能找到第一个)

 

 例:删除vector中的指定数据

vector<int> a;
a.push_back(0);
a.push_back(7);
a.push_back(5);
a.push_back(6);
a.push_back(6);
a.push_back(5);
//如果存在我要删除a中的所有5;
auto begin = a.begin();
while (begin != a.end())
{
	auto it = find(begin, a.end(), 5);
	if (it != a.end())
	{
		begin = a.erase(it);
	}

}
for (auto& x : a)
{
	cout << x << " ";
}

 7.3erase和insert(都是用迭代器实现)

erase

分别是删除指定迭代器位置的数据,并返回新的下个位置。和范围删除。

                                                                        insert

 在指定的迭代器位置前,插入数据。或者插入n个相同的数据,或者插入一个数据段。 

7.4swap

交换两个vector的数据空间,实际上是利用库的swap,分别交换_str,_size,_capacity,然后在类里面保证成函数

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

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

相关文章

Excel数据分析!开启数据洞察之门

Excel数据分析&#xff01;开启数据洞察之门 前言Excel数据分析 前言 Excel&#xff0c;这款我们都耳熟能详的办公软件&#xff0c;在数据分析的舞台上&#xff0c;扮演着至关重要的角色。它不仅仅是一个简单的电子表格工具&#xff0c;更是我们开启数据洞察之门的一把钥匙。 …

深度学习的应用综述

文章目录 引言深度学习的基本概念深度学习的主要应用领域计算机视觉自然语言处理语音识别强化学习医疗保健金融分析 深度学习应用案例公式1.损失函数(Loss Function) 结论 引言 深度学习是机器学习的一个子领域&#xff0c;通过模拟人脑的神经元结构来处理复杂的数据。近年来&…

又放大招!2024 OpenAI 开发者日总结:实时 API、提示词缓存、模型蒸馏与视觉微调等多项技术革新

在全球开发者翘首以盼中&#xff0c;OpenAI 于 2024 年 10 月 1 日在旧金山举办了年度开发者日活动。与往年不同&#xff0c;今年的活动并未发布全新的模型&#xff0c;取而代之的是多项面向开发者的 API 能力提升和工具更新。本文将深入剖析 OpenAI 在开发者日中亮相的几项重要…

中伟视界:精准计数,智能预警,矿山罐笼管理迈入AI时代

矿山罐笼乘员超限检测AI算法工作原理&#xff0c;有哪些参数需要考虑的&#xff1f;及其应用效果如何&#xff1f; 矿山罐笼乘员超限检测AI算法工作过程是设置罐笼一次乘坐人数&#xff0c;系统设置检测框&#xff0c;系统计数从一端进入后从另一端出去的人数&#xff0c;累积人…

五子棋双人对战项目(6)——对战模块(解读代码)

目录 一、约定前后端交互接口的参数 1、房间准备就绪 &#xff08;1&#xff09;配置 websocket 连接路径 &#xff08;2&#xff09;构造 游戏就绪 的 响应对象 2、“落子” 的请求和响应 &#xff08;1&#xff09;“落子” 请求对象 &#xff08;2&#xff09;“落子…

如何使用ssm实现基于java的实验室设备管理系统

TOC ssm768基于java的实验室设备管理系统jsp 绪论 1.1研究背景与意义 1.1.1研究背景 近年来&#xff0c;第三产业发展非常迅速&#xff0c;诸如计算机服务、旅游、娱乐、体育等服务行业&#xff0c;对整个社会的经济建设起到了极大地促进作用&#xff0c;这一点是毋庸置疑…

SpringBoot与舞蹈艺术:古典舞在线交流平台开发记

第二章 相关技术介绍 2.1Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xf…

【基础算法总结】链表篇

目录 一&#xff0c; 链表常用技巧和操作总结二&#xff0c;算法原理和代码实现2.两数相加24.两两交换链表中的节点143.重排链表23.合并k个升序链表25.k个一组翻转链表 三&#xff0c;算法总结 一&#xff0c; 链表常用技巧和操作总结 有关链表的算法题也是一类常见并且经典的题…

案例-猜数字游戏

文章目录 效果展示初始画面演示视频 代码区 效果展示 初始画面 演示视频 猜数字游戏 代码区 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,…

【题解】【动态规划,最长上升子序列LIS】—— [CSP-J 2022] 上升点列

【题解】【动态规划&#xff0c;最长上升子序列LIS】—— [CSP-J 2022] 上升点列 [CSP-J 2022] 上升点列题目描述输入格式输出格式输入输出样例输入 #1输出 #1输入 #2输出 #2 提示 1.题意解析2.AC代码 [CSP-J 2022] 上升点列 通往洛谷的传送门 题目描述 在一个二维平面内&am…

GAMES101(19节,相机)

相机 synthesis合成成像&#xff1a;比如光栅化&#xff0c;光线追踪&#xff0c;相机是capture捕捉成像&#xff0c; 但是在合成渲染时&#xff0c;有时也会模拟捕捉成像方式&#xff08;包括一些技术 动态模糊 / 景深等&#xff09;&#xff0c;这时会有涉及很多专有名词&a…

确保接口安全:六大方案有效解决幂等性问题

文章目录 六大方案解决接口幂等问题什么是接口幂等&#xff1f;天然幂等不做幂等会怎么样&#xff1f; 解决方案1&#xff09;insert前先select2&#xff09;使用唯一索引3&#xff09;去重表加悲观锁4&#xff09;加乐观锁之版本号机制5&#xff09;使用 Redisson 分布式锁6&a…

银河麒麟系统内存清理

银河麒麟系统内存清理 1、操作步骤2、注意事项 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 当银河麒麟系统运行较长时间&#xff0c;内存中的缓存可能会积累过多&#xff0c;影响系统性能。此时&#xff0c;你可以通过简单的命令来清理这…

问:LINUXWINDOWS线程CPU时间如何排序?

Linux 在Linux上&#xff0c;你可以使用ps命令结合sort命令来查看和排序进程或线程的CPU使用时间。 查看进程的CPU使用时间并按时间排序 使用ps命令的-o选项可以自定义输出格式&#xff0c;-e选项表示显示所有进程&#xff0c;--sort选项用于排序。 ps -e -o pid,tid,comm,…

排序大全(干货)

目录 1. 插入排序步骤&#xff1a; 2.选择排序思路&#xff1a;每次从待排序列中选出一个最小值&#xff0c;然后放在序列的起始位置&#xff0c;直到全部待排数据排完即可。实际上&#xff0c;我们可以一趟选出两个值&#xff0c;一个最大值一个最小值&#xff0c;然后将其放…

【springboot】整合LoadBalancer

目录 问题产生背景解决方案&#xff1a;实现LoadBalancer1. 添加依赖2. 配置文件3. 使用LoadBalancer4. 使用 RestTemplate 进行服务调用5. 测试 问题产生背景 以下是一个购物车项目&#xff0c;通过调用外部接口获取商品信息&#xff0c;并添加到购物车中&#xff0c;这段代码…

如何使用ssm实现中学生课后服务的信息管理与推荐+vue

TOC ssm766中学生课后服务的信息管理与推荐vue 第一章 绪论 1.1 选题背景 目前整个社会发展的速度&#xff0c;严重依赖于互联网&#xff0c;如果没有了互联网的存在&#xff0c;市场可能会一蹶不振&#xff0c;严重影响经济的发展水平&#xff0c;影响人们的生活质量。计算…

查缺补漏----I/O中断处理过程

中断优先级包括响应优先级和处理优先级&#xff0c;响应优先级由硬件线路或查询程序的查询顺序决定&#xff0c;不可动态改变。处理优先级可利用中断屏蔽技术动态调整&#xff0c;以实现多重中断。下面来看他们如何运用在中断处理过程中&#xff1a; 中断控制器位于CPU和外设之…

SpringBoot开发:古典舞在线交流平台的架构与实现

第三章 系统分析 3.1 可行性分析 需要使用大部分精力开发的古典舞在线交流平台为了充分降低开发风险&#xff0c;特意在开发之前进行可行性分析这个验证系统开发是否可行的步骤。本文就会从技术角度&#xff0c;经济角度&#xff0c;还有操作角度等进行综合阐述。 3.1.1技术可行…

排序01 多目标模型

引入 使用机器学习方法对指标做预估&#xff0c;再对预估分数做融合。融合方法&#xff1a;加权和方法给不同指标赋予不同的权重&#xff0c;权重是做A/B test调试得到的。还有更好地融合方法。 多目标模型 排序模型的输入是各种各样的特征&#xff0c;用户特征主要是用户id和…