C++——vector
目录
vector
vector常用接口
构造函数
operator[]+size()
迭代器
范围for
capacity()
resize()
reverse()
push_back和pop_back
insert
erase()
algorithm::sort
注意
迭代器失效
vector
vector单词直译是向量的意思,这个容器可以容纳不同的类型数据,并且是一个连续的可自动增长的顺序表。
// 它有两个模板参数,第一个就是vector要存放的类型,需要显示实例化 // 第二个叫做空间配置器,如果不写,默认就是库中的 template <class T, class Alloc = allocator<T>> class vector;
vector常用接口
构造函数
#include <vector> // 需要包含头文件vector<int> first; // 一个空vector,可以存放int vector<int> second (4,100); // 插入4个值为100的数据 vector<int> third (second.begin(),second.end()); // 根据迭代器区间去构造 vector<int> fourth (third); // 拷贝构造operator[]+size()
reference operator[] (size_type n); // 返回值reference是返回的引用 const_reference operator[] (size_type n) const; // 返回const引用size_type size() const; // 返回vector中的个数vector<int> v1(4, 100); for (int i = 0; i < v1.size(); i++) // 对每个值操作都是可以的 {cout << v1[i] << " ";v1[i]++; }迭代器
vector<int>::it = it.begin(); // 返回vector初始位置的指针 while (it != v1.end()) // it不等于vector最后一个位置的下一个指针 {(*it)++; // 这里有优先级的问题,一定要先解引用才可以拿到数据,否则迭代器就会先移动cout << *it << " ";it++; }// 还有其他迭代器使用方法是一样的范围for
vector<int> v1(4, 100); for (auto e : v1) // 底层也是使用了迭代器 {cout << e << " "; }capacity()
size_type capacity() const; // 返回容器开辟的空间resize()
void resize (size_type n, value_type val = value_type()); // 这个value_type就是显示实例化的那个模板参数 vector<int> v1(4, 100); // resize有几种情况 v1.resize(2); // 第一种,n < v1.size(),v1.size()会变成n,原来大于n的位置的数据会直接移除 v1.resize(5, 1); // 第二种,n > v1.size(),v1.size()会变成n,并且没有初始化过的数据初始化为val v1.resize(10); // 第三种,n > v1.size(),没有给val的值,v1.size()会变成n,没有初始化过的值赋值为0 // 以上三种如果vector空间不够会自动开辟空间,空间很大,size变得很小也会释放空间reverse()
void reserve (size_type n); // 重新申请大小为n的空间 // 如果n小于现在的capacity不操作,如果n大于capacity就重新申请大小为n的空间push_back和pop_back
void push_back(const value_type& val); // 尾插 void pop_back(); // 尾删 // 不做过多介绍了insert
void insert(iterator pos, size_type n, const value_type& val); // 传入一个迭代器,把val的值插入pos的位置 void insert (iterator pos, InputIterator first, InputIterator last); // 在pos位置插入一段迭代器区间 // string中还有find这样的函数还能找到下标,但是vector中并没有这个接口 // 所以在algorithm这个库中就有这个函数 template <class InputIterator, class T> InputIterator find (InputIterator first, InputIterator last, const T& val); // 在一段迭代器区间找到valvector<int> v(4, 1); vector<int>::iterator pos = find(v.begin, v.end(), 1);erase()
iterator erase (iterator pos); // 删除pos位置 iterator erase (iterator first, iterator last); // 删除一段区间vector<int> v(4, 1); vector<int>::iterator:: pos = find(v.begin(), v.end(), 1); if (pos != v.end()) // 这里最好还是判断一下,如果没找到就不删,不会报错 {erase(pos); }algorithm::sort
template <class RandomAccessIterator> void sort (RandomAccessIterator first, RandomAccessIterator last); // 这个函数虽然不是vector库中的,但还排序还是很好用的,它的底层是使用的快排 // 这个函数默认排的是升序 vector<int> v; v.push_back(2); v.push_back(1); v.push_back(7); v.push_back(4); sort(v.begin(). v.end());// 要是想要排降序呢 template <class RandomAccessIterator, class Compare> void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp); // 前两个还是迭代器区间,最后一个参数决定是升序还是降序 // 在库中有一个类模板less<T>,把这个传入就是升序,也不需要传 // 升序要再包含一个头文件functional,这样就可以使用greater<T>这个类模板了 sort(v.begin(), v.end(), greater<int>()); // 传入的是一个对象,所以使用匿名对象
注意
// vector不仅可以存放int,它甚至可以存放string vector<string> strV; string str("abc"); strV.push_back(str); strV.push_back(string("abc")); strV.push_back("abc");// 遍历 for (auto& str : strV) // 这里注意的是,使用引用传参,如果不加引用就是深拷贝,深拷贝的代价很大 {}
迭代器失效
迭代器也用过了,但是使用的过程中还会出现一些奇怪的问题。
vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); vector<int>::iterator pos = find(v.begin(), v.end(), 3); if (pos != v.end()) {v.insert(pos, 10);v.insert(pos, 20); }
vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); auto it = v.begin(); while (it != v.end()) {if (*it % 2 == 0)erase(it);it++; }
// 库中有这两个函数的声明,这里的返回值是操作后的下一个数,使用的时候一定要接受返回值 iterator insert (iterator position, const value_type& val); iterator erase (iterator position);if (pos != v.end()) {pos = v.insert(pos, 10);// 插入10,下一个位置就是3,扩容完之后pos的位置也是正确的pos = v.insert(pos, 20); // 再插入20就不会出错 }while (it != v.end()) {if (*it % 2 == 0)it = erase(it); // 这里不赋值也可以,如果删除了,it不动就是下一个的位置elseit++; // 不删除再++ }当然不止这两种实例可以证明迭代器失效,但是出的都是这一类问题,所以使用这两个函数的时候,一定要更新pos的位置,直接访问会出问题,这就是迭代器失效。迭代器失效的情况在不同平台下的效果是不一样的。
相关文章:
C++——vector
目录 vector vector常用接口 构造函数 operator[]size() 迭代器 范围for capacity() resize() reverse() push_back和pop_back insert erase() algorithm::sort 注意 迭代器失效 vector vector单词直译是向量的意思,这个容器可以容纳不同的类型数据&am…...
html5语义化标签
目录 前言 什么是语义化标签 常见的语义化标签 语义化的好处 前言 HTML5 的设计目的是为了在移动设备上支持多媒体。之前网页如果想嵌入视频音频,需要用到 flash ,但是苹果设备是不支持 flash 的,所以为了改变这一现状,html5 …...
SQL Server批量删除数据库中的表
如果想要删除数据库中temp 开头的中间表 1. SQL 语句实现 use [DBName] --todo go select drop table name from sys.tables where name like temp% go 将查询结果粘贴到数据库中运行 2. 数据库 单击目标数据库中的Tables ,然后按F7 键,按Name 进行排序&…...
使用SecScanC2构建P2P去中心化网络实现反溯源
个人博客: xzajyjs.cn 前言 这款工具是为了帮助安全研究人员在渗透测试过程中防止扫描被封禁、保护自己免溯源的一种新思路。其利用到了区块链中的p2p点对点去中心化技术构建以来构建代理池。 工具链接:https://github.com/xzajyjs/SecScanC2 实验过程 该工具分为…...
【API篇】七、Flink窗口
文章目录 1、窗口2、分类3、窗口API概览4、窗口分配器 在批处理统计中,可以等待一批数据都到齐后,统一处理。但是在无界流的实时处理统计中,是来一条就得处理一条,那么如何统计最近一段时间内的数据呢? ⇒ 窗口的概念&…...
软件测试面试1000问(含文档)
前前后后面试了有20多家的公司吧,最近抽空把当时的录音整理了下,然后给大家分享下 开头都是差不多,就让做一个自我介绍,这个不用再给大家普及了吧 同时,我也准备了一份软件测试视频教程(含接口、自动化、…...
进阶课4——随机森林
1.定义 随机森林是一种集成学习方法,它利用多棵树对样本进行训练并预测。 随机森林指的是利用多棵树对样本进行训练并预测的一种分类器,每棵树都由随机选择的一部分特征进行训练和构建。通过多棵树的集成,可以增加模型的多样性和泛化能力。…...
【Docker】Dockerfile使用技巧
开启Buildkit BuildKit是Docker官方社区推出的下一代镜像构建神器,可以更加快速,有效,安全地构建docker镜像。 尽管目前BuildKit不是Docker的默认构建工具,但是完全可以考虑将其作为Docker(v18.09)的首选…...
一招解决“请在微信客户端中打开链接”
一招解决“请在微信客户端中打开链接”-遇见你与你分享 在浏览器访问网站,却提示“请在微信客户端打开链接”。虽然这个情况你可能从未遇到过,但对于爱折腾的小伙伴,确是一道拦路虎 其实解决办法很简单,就是新建一个UA࿱…...
Python循环语句(一)
目录 一.while循环1.while循环的基础语法2.while循环的嵌套应用3.while循环嵌套案例 一.while循环 1.while循环的基础语法 while循环注意点 while的条件需得到布尔类型,True表示继续循环,False表示结束循环需要设置循环终止的条件,如i 1配…...
期中考核复现
web 1z_php ?0o0[]1A&OoO[]2023a include "flag.php":尝试包含名为 "flag.php" 的文件。这意味着它会尝试引入一个名为 "flag.php" 的脚本文件,其中可能包含一些敏感信息或标志。 error_reporting(0):…...
基于XML的Web服务Java接口(JAX-WS)、Jakarta XML Web Services Eclipse 实现
简介 JAX-WS(Java API for XML-Based Web Services),是创建web服务的Java编程接口,特别是SOAP服务。是Java XML编程接口之一,是Java SE 和Java EE 平台的一部分。 JAX-WS 2.0 规范是代替JAX-RPC 1.0的下一代Web服务AP…...
公网无信号区域远程抄表问题解决方案及产品选型
摘要:随着计量自动化系统的逐步完善,电网全用户表码信息采集成为系统数据得以深化应用的重要基础。利用无线公网通信是目前实现远程抄表的主要手段之一,但仍存在公网难以覆盖的偏远山区、公网信号屏蔽地下室或弱信号区域,无法实现…...
lunar-1.5.jar
公历农历转换包 https://mvnrepository.com/artifact/com.github.heqiao2010/lunar <!-- https://mvnrepository.com/artifact/com.github.heqiao2010/lunar --> <dependency> <groupId>com.github.heqiao2010</groupId> <artifactId>l…...
c++编译使用log4cplus
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、log4cplus是什么?二、使用步骤1.下载源代码2.开始配置1.配置介绍2.开始编译 3.cmake引用4.示例 总结 前言 C很强大,但是仍然有很多…...
zookeeper源码(02)源码编译启动及idea导入
本文介绍一下zookeeper-3.9.0源码下载、编译及本地启动。 下载源码 git clone https://gitee.com/apache/zookeeper.gitcd zookeeper git checkout release-3.9.0 git checkout -b release-3.9.0源码编译 README_packaging.md文件 该文件介绍了编译zookeeper需要的环境和命…...
Github 2FA绑定中国+86手机号码实现两步验证
GitHub宣布,到 2023 年底,所有用户都必须要启用双因素身份验证 (2FA),不能只用密码. GitHub开启2FA后,除了输入密码外,还需要通过一次性密码(OTP)等方式做第二级身份验证,才能成功登…...
windows安装mysql-8.0.35
打开cmd(以管理员身份运行),切换到mysql下的bin目录 mysqld --initialize 执行完毕之后,在data目录下会生成很多文件。 打开cmd(以管理员身份运行),切换到mysql下的bin目录,如果刚才的cmd没有关闭,可以继续mysqld -…...
最详细STM32,cubeMX串口发送,接收数据
这篇文章将详细介绍 串口 发送数据,接受数据。 文章目录 前言一、串口的基础知识二、cubeMX 配置三、自动生成代码解析四、串口发送数据函数五、使用串口收发数据点亮 led重定向函数: 总结 前言 实验开发板:STM32F103C8T6。所需软件…...
Kafka入门04——原理分析
目录 01理解Topic和Partition Topic(主题) Partition(分区) 02理解消息分发 消息发送到分区 消费者订阅和消费指定分区 总结 03再均衡(rebalance) 再均衡的触发 分区分配策略 RangeAssignor(范围分区) RoundRobinAssignor(轮询分区) StickyAssignor(粘性分区) Re…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...
Yii2项目自动向GitLab上报Bug
Yii2 项目自动上报Bug 原理 yii2在程序报错时, 会执行指定action, 通过重写ErrorAction, 实现Bug自动提交至GitLab的issue 步骤 配置SiteController中的actions方法 public function actions(){return [error > [class > app\helpers\web\ErrorAction,],];}重写Error…...

