C++ STL库之Vector简介及例题(二)

C++ STL库之Vector简介及例题(二)

继“C++ STL库之Vector简介及例题(一)【点击查看】”之后,这篇文章我们继续上一次的介绍,继续对vector的一些算法的函数进行简析及例题分析。

元素操作

删除第2个元素:vec.erase(vec.begin()+1);

删除区间[ i , j )的元素:vec.erase(vec.begin() + i, vec.begin() + j);

删除区间后3个元素:vec.erase(vec.end() - 3, vec.end());

清空vec容器:vec.clear();

其他元素操作遇到会在进行详细解释。

排序

进行数组内排序:sort();

sort()有三个参数,begin区间开头(包含),end区间结尾(不包含),cmp排序规则(可自定义)。

cmp参数可不写,默认升序。

#include <iostream>
#include <algorithm> // 包含sort()函数的头文件
#include <vector>
using namespace std;int main()
{vector<int> vec{ 7,5,9,3,2,4 };// 对数组进行升序排序 // 注意:vec.end()指向最后一个元素的后一位sort(vec.begin(),vec.end());	return 0;
}

 

如果要进行降序排序,我们可以自定义排序规则,例如:

/*头文件略
*/bool cmp(int x, int y) {return x > y;	// 自定义降序
}int main() {vector<int> vec{ 9,4,7,1,6 };sort(vec.begin(), vec.end(), cmp);	// 第三个参数用自定义的参数for (auto it = vec.begin(); it != vec.end(); ++it) {cout << *it << endl;}return 0;
}

 

同样的,我们也可以自定义各种不一样的排序方法;

例如:对所有数字的个位数进行升序排序。

/*头文件略
*/bool cmp(int x, int y) {return x % 10 < y % 10;  // 对数字取个位
}int main() {vector<int> vec{ 97,412,76,11,699 };sort(vec.begin(), vec.end(), cmp);for (auto it = vec.begin(); it != vec.end(); ++it) {cout << *it << " ";}/*输出结果为: (对个位升序)11 412 76 97 699*/return 0;
}

去重

vector进行去重通常涉及排序和unique算法的组合。以下是进行去重的步骤:

1. 首先对vector进行排序,以确保所有重复元素都相邻排列;

2. 然后使用std::unique重排vector,将重复的元素移到容器末尾;

3. 最后,使用vectorerase方法去除重复元素;

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {vector<int> vec = { 6,6,4,6,2,7,4,1 };sort(vec.begin(), vec.end());// 使用 std::unique 来去除连续重复的元素,它会返回不重复序列的新的逻辑结尾auto last = unique(vec.begin(), vec.end());// 从 vector 中移除重复的元素,resize 容器以移除未定义的尾部元素vec.erase(last, vec.end());for (int it : vec) {cout << it << " ";}return 0;
}

 

unique解析:

unique是一个函数模板,它的作用是去除相邻重复元素。它会重新排列范围内的元素,使得每个元素只出现一次且顺序保持不变,但它并不会改变容器的大小相反,它会返回一个指向“新的”逻辑末尾的迭代器。

1. std::unique遍历给定的迭代器范围(通常是一个容器的开始和结束)。

2. 每当它找到一组相邻的重复元素时,它就会把这组重复元素的第一个以外的所有元素移动到范围的末尾。

3. 最后,它返回一个迭代器,指向没有重复元素的序列的新逻辑结尾。

例如,数列{1,2,2,3,3,4,6,7},进行unique操作后,数列变成{1,2,3,4,6,7,2,3},并且返回一个迭代器指向7后面的2

重要的是要注意,这个“新的逻辑结尾”之后的元素仍然存在于容器中,但它们的值已经是未定义的,并且通常是重复元素的副本。为了真正地删除这些元素,你需要使用容器的erase方法,它接受两个迭代器作为参数,表示要删除的元素的范围。

例题

力扣26题——删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums ,请你删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

1. 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要;

2. 返回 k

 

题解

这是一道简单题,主要是为了把这篇文章讲的内容串联起来应用。

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int result_26(vector<int>& nums) {auto new_end = unique(nums.begin(), nums.end());return  distance(nums.begin(), new_end);
}int main() {vector<int> nums = { 0, 0, 1, 1, 1, 2, 2, 3, 3, 4 };cout << result_26(nums);return 0;
}/*
力扣提交代码:
class Solution {
public:int removeDuplicates(vector<int>& nums) {auto new_end = unique(nums.begin(), nums.end());return  distance(nums.begin(), new_end);}
};
*/

 

代码解释

大部分代码都比较简单,在上面都已经写了作用和详细解释,这里主要讲一下新出现的函数distance:调用 distance 函数计算从 nums 的起始迭代器到 new_end 迭代器的距离。这个距离就是去除相邻重复元素后容器的新长度。

distance 的作用是返回两个迭代器之间的距离,即它们指向的元素之间的元素数量,在计算数组长度的算法题中可以经常被用到。

事件复杂度分析

这段代码主要包含两个部分,std::unique 函数的调用和 std::distance 函数的调用。

1. unique 函数:

  对于 vectorunique 函数通常具有线性时间复杂度,即 O(n),其中 n 是 vector 中的元素个数。这是因为 unique 需要遍历整个 vector 一次,以便重新排列元素,使得每个重复的元素只出现一次,并返回新的逻辑末尾迭代器(也就是新的end(),指向有序不重复数列的后一位)。

2. distance 函数:

  distance 函数对于随机访问迭代器具有常数时间复杂度,即 O(1)。然而在这种情况下,distance 的时间复杂度实际上取决于 unique 操作后的新的逻辑末尾和原始 vector 起点之间的距离,但由于这个距离最多与 vector 的原始长度相同,它依然是 O(n)。无论如何,distance 不会增加整个函数的最坏情况时间复杂度。

综合这两个操作,整个 result_26 函数的时间复杂度是线性的,即 O(n)。这里的 n 是传入 vector 的元素数量。

main 函数中,result_26(nums) 被调用一次,所以 main 函数的时间复杂度也是 O(n)。

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

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

相关文章

Hive之set参数大全-22(完)

指定是否启用矢量化处理复杂数据类型 在 Hive 中&#xff0c;hive.vectorized.complex.types.enabled 是一个配置参数&#xff0c;用于指定是否启用矢量化处理复杂数据类型。以下是有关该参数的一些解释&#xff1a; 用途&#xff1a; 该参数用于控制是否启用 Hive 的矢量化执…

安卓逆向学习之ADB的配置和使用及刷机root

ADB的配置和使用 ADB即Android Debug Bridge&#xff0c;安卓调试桥&#xff0c;是谷歌为安卓开发者提供的开发工具之一&#xff0c;可以让你的电脑以指令窗口的方式控制手机。可以在安卓开发者网页中的 SDK 平台工具页面下直接下载对应系统的 adb 配置文件&#xff0c;大小只…

矩阵键盘的使用

在定义局部变量时&#xff0c;一定要给该变量赋初值。在这个程序中&#xff0c;给按键按下的返回值变量 KeyNum 赋值为 20 。 矩阵键盘线行扫描法的学习链接&#xff1a;https://www.bilibili.com/video/BV1dv411z7Gd/?spm_id_from333.999.0.0&vd_sourceb91967c499b23106…

SpringBoot项目监听reids中过期的key

使用redission客户端操作redis maven依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.2.8.RELEASE</version> </dependency> <depe…

Vue3的v-model说明和使用方法

Vue 3 的 v-model 是一个语法糖&#xff0c;它为表单输入和应用状态之间创建了双向绑定。这样&#xff0c;当用户在表单中输入时&#xff0c;数据会自动更新&#xff0c;反之亦然。 说明 在 Vue 3 中&#xff0c;v-model 实际上是基于 value 属性和 input 事件实现的。这意味…

Python 因果推断(上)

引言 原文&#xff1a;causal-methods.github.io/Book/Introduction.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 作者&#xff1a;Vitor Kamada 电子邮件&#xff1a;econometrics.methodsgmail.com 最后更新日期&#xff1a;2020 年 8 月 15 日 这本书是使…

jupyter出现问题ModuleNotFoundError: No module named ‘exceptiongroup‘

今天使用pyg的jupyter环境发现这个环境没法用, 所以只能把这个kernel给重删了然后再装&#xff0c;操作记录如下 查看kernel jupyter kernelspec list注意不是jupyter kernel --list 需要加关键字spec, 删除kernel jupyter kernelspec remove pyg当重新安装这个kernel时可能…

阿里云云上微服务 EDAS接入使用以及注意事项

阿里云分布式应用服务&#xff08;EDAS, Elastic Distributed Application Service&#xff09;是阿里云提供的一款支持微服务架构的PaaS平台&#xff0c;它帮助用户在云端构建、部署和管理分布式应用。接入EDAS并使用其进行云上微服务管理主要包括以下步骤及注意事项&#xff…

Qt容器类

一、概述 用来存储其他的类或者数据。存储基础的int&#xff0c;float类型&#xff0c;也可以是QString&#xff0c;QDate类型。Qt的容器类比STL(标准模板库)中的容器类更轻巧、安全和易于使用。 Qt的容器类分为顺序容器&#xff08;sequential containers&#xff09;和关联容…

Redis -- 常用数据结构,认识数据类型和编码方式

"人生就像骑自行车&#xff0c;要保持平衡&#xff0c;就必须保持前进。" — 爱因斯坦 说到数据结构&#xff0c;或许就能想到哈希表&#xff0c;列表集合等数据结构。对于redis来说对应的key的value的形式也可以是这些数据结构&#xff0c;如下&#xff1a; 针对上面…

深度学习:机器学习的革命性突破

深度学习&#xff08;Deep Learning&#xff09;是机器学习领域中的一个新的研究方向&#xff0c;主要是通过建立类似于人脑的神经网络来模仿人类的感知、记忆、理解和生成等能力。深度学习的核心是神经网络&#xff0c;它能够从大量的数据中自动提取有用的特征&#xff0c;并基…

导出Mysql数据库表名和字段并合并成一个word

参考链接&#xff1a; 导出MySQL数据库所有库和字段注释及相关信息为word文档——工具类 java - Apache POI - How to copy tables from one docx to another docx - Stack Overflow 领导让我研究下一个低代码平台的代码&#xff0c;我就想着做一个把数据库字段直接导出来的…

【论文阅读】Long-Tailed Recognition via Weight Balancing(CVPR2022)附MaxNorm的代码

目录 论文使用方法weight decayMaxNorm 如果使用原来的代码报错的可以看下面这个 论文 问题&#xff1a;真实世界中普遍存在长尾识别问题&#xff0c;朴素训练产生的模型在更高准确率方面偏向于普通类&#xff0c;导致稀有的类别准确率偏低。 key:解决LTR的关键是平衡各方面&a…

Android 12 系统开机动画

一、查找Android系统提供的开机动画 在Android系统源码目录下输入 find ./ -name "bootanimation.zip" 如图所示 所输出的路劲即为bootanimation.zip所在路径&#xff0c;每个系统都不一样&#xff0c;建议用命令查找 二、复制到对应目录下 android12\out\target\…

AIGC,ChatGPT4 实际需求效办公自动化函数应用

用实际需求来给大家演示一下ChatGPT如何助力办应用。 首先我们来提取年份值 我们将公式复制到表格即可。 接下来进行向下填充。 就得到了所有年份&#xff0c; 接下来我们完成第二个需求&#xff0c;按年份统计销售额。 Prompt&#xff1a;有一个表格C列是年份&#xff0c;D列…

【干货】【常用电子元器件介绍】【电容】(二)--电容器的主要参数、测量、选择与应用

声明&#xff1a;本人水平有限&#xff0c;博客可能存在部分错误的地方&#xff0c;请广大读者谅解并向本人反馈错误。 一、 电容器的主要参数 1.1 耐压 耐压(Voltage Rating)是指电容器在电路中长期有效地工作而不被击穿所能承受的最大直流电压。对于结构、介质、容量相同的…

【计算机网络】网络的网络

网络的网络 客户 customer 接入ISP提供商 provider 全球承载ISP多个ISP的层级结构 第一层ISP &#xff08;tier-1 ISP &#xff09; 位于顶部 区域ISP &#xff08;reginal ISP&#xff09;Level 3通信 &#xff0c;AT&T&#xff0c;Sprint &#xff0c;NTT存在点&#x…

关于痛苦。

追寻幸福是一件好事&#xff0c;但是学会向痛苦靠拢也很重要。 ”痛苦是老师“&#xff0c;生活中的各种反馈持续的训练着我们&#xff0c;并且是无意识的。我们对痛苦感到厌恶&#xff0c;我们喜欢多巴胺的冲击&#xff0c;而我们的习惯就是从这些和其他大脑的化学物质中滋养…

Spring AOP实现

Spring AOP实现 AOP概述什么是AOP什么是Spring AOP Spring AOP快速入门引入依赖实现计时器 Spring AOP详解Spring AOP核心概念切点(Pointcut)连接点(Join Point)通知(Advice)切面(Aspect) 通知类型注意事项 PointCut多个切面切面优先级 Order切点表达式execution表达式annotati…

Ubuntu 隐藏Telnet主机SSH服务时显示版本信息问题

一、背景 默认情况下&#xff0c;我们通过telnet服务器的22端口&#xff0c;能够获取OpenSSH服务的banner信息(如下图所示)。而低版本的OpenSSH存在许多高危漏洞。。为了安全我们要隐藏这个信息。 二、隐藏Telnet版本信息 当使用telnet命令&#xff0c;telnet 192.168.31.20…