当前位置: 首页 > news >正文

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单词直译是向量的意思&#xff0c;这个容器可以容纳不同的类型数据&am…...

html5语义化标签

目录 前言 什么是语义化标签 常见的语义化标签 语义化的好处 前言 HTML5 的设计目的是为了在移动设备上支持多媒体。之前网页如果想嵌入视频音频&#xff0c;需要用到 flash &#xff0c;但是苹果设备是不支持 flash 的&#xff0c;所以为了改变这一现状&#xff0c;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 键&#xff0c;按Name 进行排序&…...

使用SecScanC2构建P2P去中心化网络实现反溯源

个人博客: xzajyjs.cn 前言 这款工具是为了帮助安全研究人员在渗透测试过程中防止扫描被封禁、保护自己免溯源的一种新思路。其利用到了区块链中的p2p点对点去中心化技术构建以来构建代理池。 工具链接&#xff1a;https://github.com/xzajyjs/SecScanC2 实验过程 该工具分为…...

【API篇】七、Flink窗口

文章目录 1、窗口2、分类3、窗口API概览4、窗口分配器 在批处理统计中&#xff0c;可以等待一批数据都到齐后&#xff0c;统一处理。但是在无界流的实时处理统计中&#xff0c;是来一条就得处理一条&#xff0c;那么如何统计最近一段时间内的数据呢&#xff1f; ⇒ 窗口的概念&…...

软件测试面试1000问(含文档)

前前后后面试了有20多家的公司吧&#xff0c;最近抽空把当时的录音整理了下&#xff0c;然后给大家分享下 开头都是差不多&#xff0c;就让做一个自我介绍&#xff0c;这个不用再给大家普及了吧 同时&#xff0c;我也准备了一份软件测试视频教程&#xff08;含接口、自动化、…...

进阶课4——随机森林

1.定义 随机森林是一种集成学习方法&#xff0c;它利用多棵树对样本进行训练并预测。 随机森林指的是利用多棵树对样本进行训练并预测的一种分类器&#xff0c;每棵树都由随机选择的一部分特征进行训练和构建。通过多棵树的集成&#xff0c;可以增加模型的多样性和泛化能力。…...

【Docker】Dockerfile使用技巧

开启Buildkit BuildKit是Docker官方社区推出的下一代镜像构建神器&#xff0c;可以更加快速&#xff0c;有效&#xff0c;安全地构建docker镜像。 尽管目前BuildKit不是Docker的默认构建工具&#xff0c;但是完全可以考虑将其作为Docker&#xff08;v18.09&#xff09;的首选…...

一招解决“请在微信客户端中打开链接”

一招解决“请在微信客户端中打开链接”-遇见你与你分享 在浏览器访问网站&#xff0c;却提示“请在微信客户端打开链接”。虽然这个情况你可能从未遇到过&#xff0c;但对于爱折腾的小伙伴&#xff0c;确是一道拦路虎 其实解决办法很简单&#xff0c;就是新建一个UA&#xff1…...

Python循环语句(一)

目录 一.while循环1.while循环的基础语法2.while循环的嵌套应用3.while循环嵌套案例 一.while循环 1.while循环的基础语法 while循环注意点 while的条件需得到布尔类型&#xff0c;True表示继续循环&#xff0c;False表示结束循环需要设置循环终止的条件&#xff0c;如i 1配…...

期中考核复现

web 1z_php ?0o0[]1A&OoO[]2023a include "flag.php"&#xff1a;尝试包含名为 "flag.php" 的文件。这意味着它会尝试引入一个名为 "flag.php" 的脚本文件&#xff0c;其中可能包含一些敏感信息或标志。 error_reporting(0)&#xff1a;…...

基于XML的Web服务Java接口(JAX-WS)、Jakarta XML Web Services Eclipse 实现

简介 JAX-WS&#xff08;Java API for XML-Based Web Services&#xff09;&#xff0c;是创建web服务的Java编程接口&#xff0c;特别是SOAP服务。是Java XML编程接口之一&#xff0c;是Java SE 和Java EE 平台的一部分。 JAX-WS 2.0 规范是代替JAX-RPC 1.0的下一代Web服务AP…...

公网无信号区域远程抄表问题解决方案及产品选型

摘要&#xff1a;随着计量自动化系统的逐步完善&#xff0c;电网全用户表码信息采集成为系统数据得以深化应用的重要基础。利用无线公网通信是目前实现远程抄表的主要手段之一&#xff0c;但仍存在公网难以覆盖的偏远山区、公网信号屏蔽地下室或弱信号区域&#xff0c;无法实现…...

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

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、log4cplus是什么&#xff1f;二、使用步骤1.下载源代码2.开始配置1.配置介绍2.开始编译 3.cmake引用4.示例 总结 前言 C很强大&#xff0c;但是仍然有很多…...

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宣布&#xff0c;到 2023 年底&#xff0c;所有用户都必须要启用双因素身份验证 (2FA)&#xff0c;不能只用密码. GitHub开启2FA后&#xff0c;除了输入密码外&#xff0c;还需要通过一次性密码&#xff08;OTP&#xff09;等方式做第二级身份验证&#xff0c;才能成功登…...

windows安装mysql-8.0.35

打开cmd(以管理员身份运行)&#xff0c;切换到mysql下的bin目录 mysqld --initialize 执行完毕之后&#xff0c;在data目录下会生成很多文件。 打开cmd(以管理员身份运行)&#xff0c;切换到mysql下的bin目录&#xff0c;如果刚才的cmd没有关闭&#xff0c;可以继续mysqld -…...

最详细STM32,cubeMX串口发送,接收数据

这篇文章将详细介绍 串口 发送数据&#xff0c;接受数据。 文章目录 前言一、串口的基础知识二、cubeMX 配置三、自动生成代码解析四、串口发送数据函数五、使用串口收发数据点亮 led重定向函数&#xff1a; 总结 前言 实验开发板&#xff1a;STM32F103C8T6。所需软件&#xf…...

Kafka入门04——原理分析

目录 01理解Topic和Partition Topic(主题) Partition(分区) 02理解消息分发 消息发送到分区 消费者订阅和消费指定分区 总结 03再均衡(rebalance) 再均衡的触发 分区分配策略 RangeAssignor(范围分区) RoundRobinAssignor(轮询分区) StickyAssignor(粘性分区) Re…...

网络通讯知识——通讯分层介绍,gRPC,RabbitMQ分层

网络通讯分层 网络通讯分层是为了将复杂的网络通信问题分解为多个独立、可管理的层次&#xff0c;每个层次专注于特定功能。目前主流的分层模型包括OSI七层模型和TCP/IP四层&#xff08;或五层&#xff09;模型&#xff0c;以下是详细解析&#xff1a; 一、OSI七层模型&#…...

ubuntu opencv 安装

1.ubuntu opencv 安装 在Ubuntu系统中安装OpenCV&#xff0c;可以通过多种方式进行&#xff0c;以下是一种常用的安装方法&#xff0c;包括从源代码编译安装。请注意&#xff0c;安装步骤可能会因OpenCV的版本和Ubuntu系统的具体版本而略有不同。 一、安装准备 更新系统&…...

C#中的依赖注入

1. 依赖注入&#xff08;Dependency Injection, DI&#xff09;概述 定义 &#xff1a;依赖注入是一种设计模式&#xff0c;允许将组件的依赖关系从内部创建转移到外部提供。这样可以降低组件之间的耦合度&#xff0c;提高代码的可测试性、可维护性和可扩展性。 核心思想 &…...

动态规划之网格图模型(二)

文章目录 动态规划之网格图模型&#xff08;二&#xff09;LeetCode 931. 下降路径最小和思路Golang 代码 LeetCode 2684. 矩阵中移动的最大次数思路Golang 代码 LeetCode 2304. 网格中的最小路径代价思路Golang 代码 LeetCode 1289. 下降路径最小和 II思路Golang 代码 LeetCod…...

【MySQL基础】数据库的备份与还原

MySQL学习&#xff1a; https://blog.csdn.net/2301_80220607/category_12971838.html?spm1001.2014.3001.5482 前言&#xff1a; 在数据库管理中&#xff0c;删除操作是不可逆的&#xff0c;因此备份是数据安全的重要保障。下面我将详细介绍MySQL数据库删除前的备份方法&am…...

C++编程——关于比较器的使用

注&#xff1a; 简单记录一下C里比较器的构建&#xff0c;常用于自定义 sort() 函数和优先队列的改写优先级。 简单构建比较器&#xff1a; sort() 函数&#xff1a; vector<int> arr;//(a, b) -> true : a < b //升序排列 bool compare(int a, int b) {retur…...

第R9周:阿尔茨海默病诊断(优化特征选择版)

文章目录 1. 导入数据2. 数据处理2.1 患病占比2.2 相关性分析2.3 年龄与患病探究 3. 特征选择4. 构建数据集4.1 数据集划分与标准化4.2 构建加载 5. 构建模型6. 模型训练6.1 构建训练函数6.2 构建测试函数6.3 设置超参数 7. 模型训练8. 模型评估8.1 结果图 8.2 混淆矩阵9. 总结…...

hbase资源和数据权限控制

hbase适合大数据量下点查 https://zhuanlan.zhihu.com/p/471133280 HBase支持对User、NameSpace和Table进行请求数和流量配额限制&#xff0c;限制频率可以按sec、min、hour、day 对于请求大小限制示例&#xff08;5K/sec,10M/min等&#xff09;&#xff0c;请求大小限制单位如…...

Spring Boot消息系统开发指南

消息系统基础概念 消息系统作为分布式架构的核心组件&#xff0c;实现了不同系统模块间的高效通信机制。其应用场景从即时通讯软件延伸至企业级应用集成&#xff0c;形成了现代软件架构中不可或缺的基础设施。 通信模式本质特征 同步通信要求收发双方必须同时在线交互&#…...

跨平台游戏引擎 Axmol-2.6.1 发布

Axmol 2.6.1 版本是一个以错误修复和功能改进为主的次要LTS长期支持版本 &#x1f64f;感谢所有贡献者及财务赞助者&#xff1a;scorewarrior、peterkharitonov、duong、thienphuoc、bingsoo、asnagni、paulocoutinhox、DelinWorks 错误修复 修复Android armv7架构崩溃问题&…...