C++ STL库之Vector简介及例题(哈希表)(一)

文章目录

    • C++ STL库之Vector简介及例题(哈希表)(一)
    • 一、初始化
    • 二、数值操作
    • 例题
    • 题解
    • 哈希表简析
    • C++哈希表初始化
    • C++哈希表基本操作

C++ STL库之Vector简介及例题(哈希表)(一)

Vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

特性1:顺序容器中的元素按照严格的线性顺序排列,可以通过元素的下标访问对应的元素。

特性2:支持对序列中的任意元素进行快速直接查询,可以在序列末尾相对快速地添加/删除元素的操作,所以不知道自己所需的数组大小时,可以用Vector以节约空间。

注意: Vector容器的用法有很多,内置算法函数也有很多,这里就不一一介绍了,就写一些常用的好理解的,如果后面遇到了我会在文章里具体解释。

一、初始化

使用vector容器时需要声明头文件#inlcude <vector>;

vector容器可以是多种数据形式例如int / char / string / 自定义类型 / 结构体类型等等

具体初始化方法如下代码及解释所示:

#include <vector>	// 头文件 #include <vector>;
#include <iostream>
using namespace std;int main() {// 限制整形数组长度为10,默认值为0vector<int> vec_int_limit(10);// 不限制数组长度vector<int> vec_int;// 直接给数组赋值vector<int> vec_int_nums{ 1,2,3,4,5,6 };// 建立string类型数组,长度为10,每个默认为"uhao"vector<string> string_array(10, "uhao");// 建立二维数组,可直接赋值vector<vector<int>> two_array{ {1,2,3},{4,5,6} };// 从原数组中取一段值赋值,goal_array数组结果是{6,5,4}// 如下代码区间为:[ original_array.begin() , original.begin()+3 )vector<int> original_array{ 6,5,4,3,2,1 };vector<int> goal_array(original_array.begin(),original_array.begin() + 3);return 0;
}

二、数值操作

Vector容器有很多种函数可以对内容进行不同操作,这里就介绍一些常用的,后续用到别的会再解释。

创建一个数组并直接赋值:vector<int> vec{ 7,5,3,1,2,0 };

访问数组下标中的元素:vec[1]; // 二维数组同理vec[num1][num2]

获取数组下标中的元素,同 vec[1]vec.at(1);

在尾部添加一个元素 8:vec.push_back(8);

删除最后一个元素:vec.pop_back();

获取vector数组元素个数,即长度:vec.size();

获取数组第一个元素的指针vec.begin();

获取数组最后一个元素+1的指针:vec.end();

获取数组第一个元素值:vec.front();

获取数组最后一个元素值:vec.back();

与数组other_array交换数据(可以说是用other_array替换vec):vec.swap(other_array);

判断是否为空,为空返回1,不为空返回0:vec.empty();

第i+1个元素前插入数据e:vec.insert(vec.begin() + i , e);

倒数第i个元素前面插入e:vec.insert(vec.end() - i , e);


例题

力扣经典第1题《两数之和》

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 

题解

思路 1

用两个for循环,暴力破解,这个方法比较简单就不写解析了,代码如下:

vector<int> twoSum(vector<int>& nums, int target) {int n = nums.size();for (int i = 0; i < n; ++i) {for (int j = i + 1; j < n; ++j) {if (nums[i] + nums[j] == target) {return {i, j};}}}return {};}// 来源:力扣(LeetCode)

 

思路 2

用两个for循环的时间复杂度比较高,所以如果我们如果能够先确定一个数字,然后在数组余下的数字中迅速找出target-x,那么我们的效率肯定会翻倍;

所以我们这个时候就会想到**哈希表。**

哈希表简析

哈希表是一种数据结构,它可以提供非常快速的数据插入和查找操作。它通过一个叫做哈希函数的过程,将存储的数据项与一个特定的索引关联起来,这个索引指示了数据项在表中的位置。

C++哈希表初始化

#include <iostream>
#include <unordered_map> // 哈希表头文件
using namespace std;int main()
{unordered_map<int, int> hashMap;  // 创建哈希表// 进行赋值hashMap[1] = 10;      hashMap[2] = 20;hashMap[3] = 30;//	it->first 用于获取当前迭代器it指向的元素下标//	it->second 用于获取当前迭代器it指向的元素值for (auto it = hashMap.begin(); it != hashMap.end(); it++) {cout << "key:" << it->first << " value:" << it->second << endl;}/*输出结果为:key:1 value:10key:2 value:20key:3 value:30*/return 0;
}

C++哈希表基本操作

1. 插入操作

// 使用下标操作符插入元素
hashMap[key] = value;// 使用insert()方法插入元素
hashMap.insert({key, value});

2. 删除操作

hashMap.erase(key); // 删除指定元素key

3. 访问

hashMap[key]; // 直接访问 或用迭代器,见上哈希表简析代码

★4. 判断元素是否存在

// 方法1 根据哈希表的特性,如果一个元素被注册过也就是存在,则count值为1,否则为0
if(hashMap.count(key) > 0){// 存在
}
else{// 不存在
}// 方法2 使用find函数,如果查找的key不存在于哈希表,则返回值与hashMap.end()相等,反之同理
if (hashMap.find(key) != hashMap.end()) {cout << "存在";
}
else {cout << "不存在";
}

大致了解了哈希表的应用之后,我们可以得出以下优化后的代码:

vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> m;for (int i = 0; i < nums.size(); ++i) {if (m.count(target - nums[i])) {return {m[target - nums[i]], i};}m[nums[i]] = i;}return {};}

代码解析

1. 创建一个空的哈希表 unordered_map<int, int> m; 用来存储数组值到索引的映射。
2. 使用一个for循环,遍历整个输入数组 nums
3. 在循环内部,使用 if 语句检查哈希表中是否存在一个键值对,其键(target - nums[i])是目标值与当前元素值的差。
4. 如果这样的键存在,说明我们找到了两个数,它们的和等于目标值:target - nums[i] 是之前某个元素的值,nums[i] 是当前元素的值。这时,我们返回一个包含两个下标的数组:先前元素的下标 m[target - nums[i]] 和当前元素的下标 i
5. 如果没有找到,则将当前元素的值和它的下标 i 加入到哈希表中,即 m[nums[i]] = i;
6. 如果整个数组都遍历完了还没有找到这样的两个数,则函数返回一个空数组 return {};
 
基本上,这段代码利用哈希表存储已经遍历过的元素的值和对应的下标,借助这个表我们能在O(1)的时间复杂度内查找到 target - nums[i]。因此,整个函数的时间复杂度是O(n),其中n是数组 nums 的长度。这是一个高效的解决方案,因为它避免了使用两个嵌套循环,这在最坏的情况下会导致O(n^2)的时间复杂度。

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

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

相关文章

代码随想录刷题笔记-Day15

1. 完全二叉树的的节点个数 222. 完全二叉树的节点个数https://leetcode.cn/problems/count-complete-tree-nodes/ 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没…

幻兽帕鲁服务器多少钱?幻兽帕鲁服务器价格,2月最新

2024年幻兽帕鲁服务器价格表更新&#xff0c;阿里云、腾讯云和华为云Palworld服务器报价大全&#xff0c;4核16G幻兽帕鲁专用服务器阿里云26元、腾讯云32元、华为云26元&#xff0c;阿腾云atengyun.com分享幻兽帕鲁服务器优惠价格表&#xff0c;多配置报价&#xff1a; 幻兽帕鲁…

Spring Boot 中使用 Spring MVC基础

Spring MVC基础 一、控制器 controller1.定制控制器的方法&#xff08;1&#xff09;接收请求&#xff08;2&#xff09;接收请求参数&#xff08;3&#xff09;返回值 二、模型 Modle三、视图 View四、总结 Spring MVC 是非常著名的 Web 应用框架&#xff0c;现在的大多数 Web…

动态规划入门题目

动态规划&#xff08;记忆化搜索&#xff09;&#xff1a; 将给定问题划分成若干子问题&#xff0c;直到子问题可以被直接解决。然后把子问题的答保存下来以免重复计算&#xff0c;然后根据子问题反推出原问题解的方法 动态规划也称为递推&#xff08;暴力深搜记忆中间状态结果…

MySQL-运算符

文章目录 1. 运算符概述2. 算术运算符3. 比较运算符4. 逻辑运算符5. 位运算符 1. 运算符概述 在 MySQL 中&#xff0c;可以通过运算符来获取表结构以外的另一种数据。MySQL 所提供的运算符可以直接对表中数据或字段进行运算&#xff0c;进而实现用户的新需求&#xff0c;增强了…

【C++】类和对象之构造函数、析构函数、拷贝构造函数(二)

前言&#xff1a;在上一篇我们对于C中类和对象有了一个初步的了解&#xff0c;今天我们将进一步的学习&#xff0c;今天我们目标是对构造函数、析构函数、拷贝构造函数进行一个初步学习在后面也会进一步的学习&#xff0c;一起加油呐&#xff01; &#x1f496; 博主CSDN主页:卫…

幻兽帕鲁服务器多少钱——幻兽帕鲁服务器价格介绍

2024年幻兽帕鲁服务器价格表更新&#xff0c;阿里云、腾讯云和华为云Palworld服务器报价大全&#xff0c;4核16G幻兽帕鲁专用服务器阿里云26元、腾讯云32元、华为云26元&#xff0c;阿腾云atengyun.com分享幻兽帕鲁服务器优惠价格表&#xff0c;多配置报价&#xff1a; 幻兽帕鲁…

c++vector解释

C中的vector是一种容器&#xff0c;用于存储一组同类型的元素。它类似于数组&#xff0c;但具有更多的功能和灵活性。vector可以自动调整大小&#xff0c;允许动态插入和删除元素。 使用vector之前&#xff0c;需要包含<vector>头文件。然后可以使用vector模板类来创建v…

Windows Service 2008虚拟机安装mysql service 5.7并实现远程连接

安装前必读 mysql好像在5.7.20版本之后的绿色压缩包版解压都没有my.ini或者my-default.ini配置文件了&#xff0c;需要自己添加配置。 也没有data数据库文件夹&#xff0c;data文件夹不能自己新建&#xff0c;需要命令initialize初始化建立。 my-default.ini文件存不存在不重要…

【影像组学入门百问】#93---#96

#93-如何实现影像组学特征的可视化&#xff1f; 特征映射实现影像组学特征的可视化是将特征值映射回原始医学图像上的对应体素&#xff0c;从而直观地展示特征在图像中的分布。通过特征映射&#xff0c;我们可以观察到哪些区域与特定特征更相关&#xff0c;以便更好地理解病变…

知识点积累系列(八)各种IDE编辑器篇【持续更新】

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 知识点积累 系列文章的第八篇&#xff0c;记录日常学习中遇到的 各种IDE编辑器 相关的知识点 1.VS Code 1.1.launch.json是干嘛的 launch.json 文件的主要作用是提供一个结构化的配置方式&#xff0c;以便在V…

JavaWeb学习|Session

学习材料声明 所有知识点都来自互联网&#xff0c;进行总结和梳理&#xff0c;侵权必删。 引用来源&#xff1a;尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版 Session 1、Session 就一个接口&#xff08;HttpSession&#xff09;。 2、Session 就是会话。它是用来…

[ESP32]在Thonny IDE中,如何將MicroPython firmware燒錄到ESP32開發板中?

[ESP32 I MicroPython] Flash Firmware by Thonny(4.1.4) IDE 正常安裝流程&#xff0c;可參考上述影片。然而&#xff0c;本篇文章主要是紀錄安裝過程遇到的bug, 供未來查詢用&#xff0c;也一併供有需要的同好參考。 問題:安裝後&#xff0c;Thonny互動介面顯示一堆亂碼和co…

【lesson26】学习MySQL事务前的基础知识

文章目录 CURD不加控制&#xff0c;会有什么问题&#xff1f;CURD满足什么属性&#xff0c;能解决上述问题&#xff1f;什么是事务&#xff1f;为什么会出现事务事务的版本支持 CURD不加控制&#xff0c;会有什么问题&#xff1f; CURD满足什么属性&#xff0c;能解决上述问题&…

文本生成高清、连贯视频,谷歌推出时空扩散模型

谷歌研究人员推出了创新性文本生成视频模型——Lumiere。 与传统模型不同的是&#xff0c;Lumiere采用了一种时空扩散&#xff08;Space-time&#xff09;U-Net架构&#xff0c;可以在单次推理中生成整个视频的所有时间段&#xff0c;能明显增强生成视频的动作连贯性&#xff…

PandaWallet :Web3.0世界的入口

如果说互联网的普及和发展造就了移动支付&#xff0c;那么Web3的到来则书写了加密支付的新篇章&#xff0c;并将加密钱包的发展推向新高潮。 传统电子钱包的功能是储存资产与移动支付。加密钱包在储存资产与移动支付的基础上&#xff0c;增加了身份标识的功能。这也是Web3中用户…

挑选合适的板式家具生产线:满足加工需求的要素解析

板式家具生产线是现代家具制造业中不可或缺的重要工具。然而&#xff0c;选择一条适合自身加工需求的板式家具生产线并不容易&#xff0c;需要考虑多方面因素。本文将深入探讨如何挑选合适的板式家具生产线&#xff0c;从而让读者更好地理解生产线的特点和选择要点。 一、需求分…

nginx+nginx-rtmp-module+ffmpeg进行局域网推流rtmp\m3u8

局域网推流的简单方式 这里以ubuntu为例 一、先下载安装包 nginx、nginx-rtmp-module&#xff0c;再一起安装 # 下载nginx # 这里我安装的是 nginx-1.10.3 版本 cd /usr/software wget http://nginx.org/download/nginx-1.25.0.tar.gz tar -zxvf nginx-1.25.0.tar.gz# 下载ng…

Prometheus---图形化界面grafana(二进制)

前言 Prometheus是一个开源的监控以及报警系统。整合zabbix的功能&#xff0c;系统&#xff0c;网络&#xff0c;设备。 proetheus可以兼容网络&#xff0c;设备。容器的监控。告警系统。因为他和k8s是一个项目基金开发的产品&#xff0c;天生匹配k8s的原生系统。容器化和云原…

详解OpenHarmony各部分文件在XR806上的编译顺序

大家好&#xff0c;今天我们来谈一谈编程时一个很有趣的话题——编译顺序。我知道&#xff0c;一提到编译可能大家会感到有点儿头疼&#xff0c;但请放心&#xff0c;我不会让大家头疼的。我们要明白&#xff0c;在开始写代码之前&#xff0c;了解整个程序的编译路径是十分有必…