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…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
C++ 类基础:封装、继承、多态与多线程模板实现
前言 C 是一门强大的面向对象编程语言,而类(Class)作为其核心特性之一,是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性,包括封装、继承和多态,同时讨论类中的权限控制,并展示如何使用类…...
工厂方法模式和抽象工厂方法模式的battle
1.案例直接上手 在这个案例里面,我们会实现这个普通的工厂方法,并且对比这个普通工厂方法和我们直接创建对象的差别在哪里,为什么需要一个工厂: 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类: 两个发…...
6.计算机网络核心知识点精要手册
计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法:数据与控制信息的结构或格式,如同语言中的语法规则语义:控制信息的具体含义和响应方式,规定通信双方"说什么"同步:事件执行的顺序与时序…...

