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…...
HunyuanVideo-Foley快速入门:VSCode远程开发与模型调试指南
HunyuanVideo-Foley快速入门:VSCode远程开发与模型调试指南 1. 前言:为什么选择VSCode远程开发? 如果你正在使用HunyuanVideo-Foley这类音效生成模型,可能会遇到这样的困扰:本地机器性能不足,而云服务器虽…...
推荐算法闲谈:如何在不同业务场景下理解和拆解核心指标
巧解决的是能不能学好,而指标分析解决的是这次改动是否真正创造了业务价值,以及为什么。一个非常常见、但又极易被忽视的事实是:推荐系统并不存在一套放之四海而皆准的核心业务指标。不同产品形态、不同交互方式、不同公司发展阶段࿰…...
告别重复造轮子:用快马平台高效生成ibbot开发脚手架与核心模块
今天想和大家分享一个提升ibbot开发效率的实用技巧。作为一个经常需要开发对话机器人的程序员,我发现每次从零开始搭建项目结构、编写基础模块特别耗时。最近尝试用InsCode(快马)平台生成项目脚手架,效果出乎意料的好。 项目结构自动生成 平台能根据自然…...
告别恼人红叉!保姆级教程:用acme.sh给宝塔面板IP地址换上Let‘s Encrypt免费证书
从红叉到绿锁:零成本为宝塔面板IP地址部署可信SSL证书全指南 每次打开宝塔面板,那个刺眼的红色安全警告是否让你如鲠在喉?作为服务器管理员,我们比谁都清楚自签名证书的实际安全性,但浏览器固执的警告提示却让新手用户…...
通信确定性可视化冗余现场总线技术开发白皮书(能源化工交通高可靠行业 Profibus DP CAN PROFINET EtherNet/IP SPE APL)
1.前言现场总线是工业物联网的核心支撑技术,但当前国际主流方案在国内应用中普遍存在开发门槛高、硬件成本高、调试维护复杂、冗余配置昂贵等问题,难以满足中小型自动化项目及国产控制系统对高性价比、高可靠性通信的需求。CANWeb现场总线深度融合CAN的高…...
新手程序员必备:收藏这份Prompt指南,轻松驾驭大模型创造业务价值!
本文系统介绍了大模型Prompt的概念、撰写框架及核心原则,深入剖析了构建高质量Prompt的实操方法。从RTF、思考链到RISEN等五大框架,再到提升Prompt效果的策略,如明确指令、结构化输出、赋予模型思考时间等,帮助读者高效驾驭大模型…...
嵌入式系统中的累加和校验算法原理与实现
1. 累加和校验算法概述在嵌入式系统开发中,数据通信的可靠性至关重要。想象一下,当你通过无线模块控制一台工业机器人时,如果传输的运动指令数据出现错误,可能导致机械臂做出完全不可预测的动作,轻则损坏产品ÿ…...
一开口就聊到客户心坎里的沟通话术
先把人聊顺,事自然就顺了一位资深顾问,老客户复购和转介绍特别多。她的秘诀很简单:先聊人,再聊事。有次对接一位态度疏离的客户,她没直接问方案,而是看到客户朋友圈刚出去玩,便说:“…...
解锁5大跨平台无线控制能力:QtScrcpy全方位使用指南
解锁5大跨平台无线控制能力:QtScrcpy全方位使用指南 【免费下载链接】QtScrcpy Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtScrcpy …...
终极Windows 11系统优化指南:使用Win11Debloat让你的电脑飞起来!
终极Windows 11系统优化指南:使用Win11Debloat让你的电脑飞起来! 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other change…...

