C++| STL之迭代器和vector

前言:在Leetcode进行手撕代码练习的时候,C++经常能碰到不定长vector的处理,所以把vector常用的知识和使用方法都汇总了一下。迭代器在各种STL容器中都能见到,顺便把迭代器说一下。

迭代器和vector

  • 迭代器
    • 概念
    • 常见操作
    • 不同容器和迭代器的区别
  • vector
    • 创建
    • 大小和容量
    • 分配内存
    • 遍历
    • 添加
    • 删除
    • 访问
    • 查找
    • 清空

迭代器

概念

迭代器:是C++STL中一种检查容器内元素并遍历元素的数据类型,通常用于对C++中各种容器内元素的访问,与指针非常类似。

常见容器:string、vector、deque、list、set等。
基本上C++STL容器的迭代器使用都差不多,可以用来遍历和访问容器。
不同的容器有不同迭代器,因为不同容器本身实现的原理结构不同,但是迭代器的功能是相同的。迭代器帮忙实现了好了遍历访问容器的方式,不需要自己去重新编写相应的功能。

常见操作

迭代器定义:

vector<int> ::iterator it;//读写
std::vector<int>::const_iterator it;//只读,不可以修改

begin()和end()函数:begin()就是指向容器第一个元素的迭代器,end()是指向容器最后一个元素的下一个位置的迭代器。
正序遍历容器:

vector<int> ::iterator it;// 读写
for( it = vector.begin(); it != vector.end(); it++ )cout<<*it<<endl;

逆向遍历容器:

vector<int> ::iterator it;// 读写for( std::vector<int>::reverse_iterator it = v.rbegin(); it!=v.rend();it++ )cout<<*it<<endl;

不同容器和迭代器的区别

迭代器特点支持
输入迭代器只读++、==、!=
输出迭代器只写++
前向迭代器读写,只能向前推进++、==、!=
双向迭代器读写,能向前向后推进++、–
随机访问迭代器读写,跳跃读取++、–、[n]、-n、<、<=、>、>=
容器迭代器
vector随机访问
string随机访问
deque随机访问
list双向
set双向
map双向
stack不支持迭代器
queue不支持迭代器

vector

vector就是不定长数组,根据需要自动增长和缩小。
原理的话,增长后大小如果连续存储空间不了的话,需要另外开辟一块足够大小的空间,复制过去,再释放原来的空间。
vector和string有点像,很多功能上会比较相似。string的话可以参考我的另一篇C++| STL之string,可以vector和string对比着看。

头文件:

#include <vector>

创建

vector<int>vec; // 创建一个整数的空vector
vector<int> vec(5);// 创建一个包含 5 个整数的vector,里面的值默认为0
vector<int> vec(5,10);// 创建一个包含 5 个整数的vector,里面的值默认为10
vector<int> vec = {1, 2, 3, 4}; // 初始化一个包含元素的vector

大小和容量

length是string特有的,sizeof计算vector和元素数量没有意义。

int size = vec.size(); // 获取vector中的元素数量
vec.capacity();// 重新分配内存之前,vector对象能包含的最大字符数
bool isEmpty = vec.empty();// 判断是否为空

分配内存

和string的是一样的。

函数:

  • reserve():为容器预留足够的空间,避免不必要的重复分配,减少系统开销,影响capacity。
  • resize():调整容器中有效数据区域的尺寸,如果尺寸变小,多余的截掉;若尺寸变大,第二个参数填充,影响size。

在做leetcode题目的时候,如果预先就知道会有多少元素,可以预先分配capacity,也就是用reserve来分配。从而来避免不定长的string和vector在不定长增加的时候,反复重新开辟空间的的系统开销。

遍历

看过了迭代器的部分,就知道vector是随机访问迭代器,可以用下标也可以用迭代器。

// vector<int>vec; 
// 1. 下标
for(int i=0;i<vec.size();i++)cout<<vec[i]<<endl;
// 2. 迭代器
vector<int> ::iterator it;// 读写
for( it = vec.begin(); it != vec.end(); it++ )cout<<*it<<endl;

添加

vec.push_back(3); // 将整数3添加到vector的末尾

删除

vec.erase(vec.begin()+2);// 删除第三个元素
vec.pop_back(); //删除vec的最后一个元素

访问

// 1. 下标
int a=vec[0];
// 2. at()
int b=vec.at(0);

查找

find也适用于普通的数组,很多容器都有这个功能,对于非线性的结构就没法限制范围的搜索了。

// 1. 不限范围
if(vec.find(x) != vec.end())cout<<x<<"存在"<<endl
// 2. 限制范围
if(vec.find(vec.begin(),vec.end(),x) != vec.end())cout<<x<<"存在"<<endl

清空

vec.clear(); // 清空vector

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

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

相关文章

Matplotlib知识点详解(巨详细!!!)

37.Matplotlib&#xff1a; 配置参数&#xff1a; 如果浏览器不显示图片&#xff0c;加上 %matplotlib inline 让图片可以显示中文 plt.rcParams[font.sans-serif]SimHei 让图片可以显示负号 plt.rcParams[axes.unicode_minus]False 支持svg矢量图 %config Inlineback…

听我的,事务注解真的别乱动!

更多大厂面试内容可见 -> http://11come.cn 听我的&#xff0c;事务注解真的别乱动&#xff01; 背景 故事的起源&#xff1a; 发现存在重复插入数据库的现象&#xff0c;通过排查发现是因为事务中包了锁 原因分析&#xff1a; 当线程 1 释放锁之后&#xff0c;但是此时还…

Java反射详细学习笔记

动态代理 特点 : 无侵入式的给代码增加额外的功能 ; 代理里面就是对象要被代理的方法 ; 通过接口保证,后面的对象和代理需要实现同一个接口 &#xff0c; 接口中就是被代理的所有方法 ; 如何为java对象创建一个代理 : java.lang.reflect.Proxy类 : 提供了为对象产生代理对象的…

【全面讲解下Docker in Docker的原理与实践】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 👉目录 👉前言👉原理👉实践👉安全和最佳实践👉前言 🦛…

linux shell(中)

结构化命令 if语句 if-then 最基本的结构化命令是 if-then 语句。if-then 语句的格式如下&#xff1a; if command thencommands ifif command; then # 通过把分号&#xff08;;&#xff09;放在待求值的命令尾部&#xff0c;可以将 then 语句写在同一行commands ifbash sh…

JAVA中的泛型机制详解

1.泛型的概念 java泛型是java5引入的一个特性&#xff0c;它允许我们为类&#xff0c;接口&#xff0c;方法指定类型参数&#xff0c;从而提供编译时类型安全检查。泛型的本质是参数化类型&#xff0c;即在声明类&#xff0c;接口或者方法时不指定具体的类型&#xff0c;而是使…

openEuler 安装 ROS2 Humble

openEuler 安装 ROS2 Humble 1 介绍2 安装【openEuler 24.03】2.1 Installing ros-humble2.2 Test ros-humble【python 版本冲突&#xff0c;未解决】 2 安装【openEuler 22.03】3 Python 版本问题【pyenv】参考 1 介绍 2 安装【openEuler 24.03】 2.1 Installing ros-humble…

FastApi接口限流

有个接口内容信息比较敏感&#xff0c;遂设置限流操作 通常的限流操作就包括对某个用户或者某个IP进行限流&#xff0c;每分钟或者每天最多能访问多少次之类的等等。FaslApi中的限流操作开源库SlowApi https://github.com/laurentS/slowapi 这个库是根据flask-limiter改编而来&…

力扣高频SQL 50题(基础版)第十三题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第十三题570. 至少有5名直接下属的经理题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50题&#xff08;基础版&#xff09;第十三题 570. 至少有5名直接下属的经理 题目说明 表: Employee ------…

Java面试八股之后Spring、spring mvc和spring boot的区别

Spring、spring mvc和spring boot的区别 Spring, Spring Boot和Spring MVC都是Spring框架家族的一部分&#xff0c;它们各自有其特定的用途和优势。下面是它们之间的主要区别&#xff1a; Spring: Spring 是一个开源的轻量级Java开发框架&#xff0c;最初由Rod Johnson创建&…

MySQL零散拾遗(七)--- 突发奇想的一些疑虑

mysql中从2018-12-18提取出2018-12&#xff0c;如何实现 要在MySQL中从日期2018-12-18提取出2018-12&#xff0c;可以使用DATE_FORMAT()函数或者EXTRACT()函数。这两种方法都可以达到目的&#xff0c;下面是具体的实现方式&#xff1a; 使用 DATE_FORMAT() DATE_FORMAT()函数…

Ubuntu 20.04.5 LTS 编译 Android T(qcm8550 or rk3588)环境配置

Ubuntu 20.04.5 LTS 编译 Android T(qcm8550 or rk3588)环境配置&#xff1a; 参考文档&#xff1a; https://source.android.google.cn/docs/setup/start?hlzh-cn Android系统开发指导 https://developer.android.google.cn/studio/run/device?hlru USB 调试配置 https://b…

Linux之存储桶minio单机安装和使用简介

一、minio简介 MinIO 是一个高性能的分布式对象存储系统&#xff0c;主要用于存储非结构化数据&#xff0c;例如照片、视频、备份和日志文件。它是开源的&#xff0c;基于 Go 语言开发&#xff0c;具有高度可扩展性和高可用性&#xff0c;能够在私有云、公有云和边缘环境中部署…

20240725项目的maven环境报红-重新配置maven

1.在编辑器里面打开项目&#xff0c;导入源码 &#xff08;1&#xff09;找到项目的地址C:\Users\zzz\IdeaProjects\datasys&#xff0c;然后右击用idea编辑器打开。 &#xff08;2&#xff09;idea中上菜单栏打开open&#xff0c;然后输入file&#xff0c;选择源代码文件 2.…

LabVIEW放大器自动测量系统

开发了一个基于LabVIEW平台的多路前置放大器自动测量系统的开发与实施。该系统集成了硬件控制与软件编程&#xff0c;能够实现放大器各项性能指标的快速自动测量&#xff0c;有效提高了测试的精确性和效率。系统设计采用了虚拟仪器技术&#xff0c;结合了先进的测量与控制策略&…

.net core 外观者设计模式 实现,多种支付选择

1&#xff0c;接口 /// <summary>/// Web页面支付/// </summary>public interface IWebPagePay{public WebPagePayResult CreatePay(string productName, string orderSn, string totalPrice);}2&#xff0c;实现接口 实现阿里支付 public class AliPagePay : IWe…

Linux的TERM环境变量

程序或者脚本驱动登录到Linux系统之后。执行命令或者脚本&#xff0c;其返回值中往往出现格式异常。原因则在于虚拟终端类型的高级特性&#xff0c;例如&#xff1a;“颜色、高亮、移动光标”等。那么&#xff0c;是否禁掉这些高级特性呢&#xff1f;可以选择dumb类型&#xff…

丹东纵横文化传媒:创新引领,广告服务再升级

近日,丹东市振兴区的丹东纵横文化传媒有限公司再次传来振奋人心的消息,这家以互联网和相关服务为主的新兴企业,在广告设计与传播领域实现了重大突破,进一步巩固了其在行业内的领先地位。 【广告服务全面升级,引领市场新风尚】 据丹东纵横文化传媒有限公司最新发布的信息显示,公…

掌握AJAX技术:从基础到实战

文章目录 **引言****1. 什么是AJAX&#xff1f;****2. AJAX的工作原理**AJAX 示例使用 Fetch API 实现 AJAX **3. 如何在项目中使用AJAX****4. 处理AJAX请求的常见问题****5. AJAX与JSON的结合****6. 使用AJAX框架和库****7. 实战&#xff1a;创建一个动态表单****8. AJAX中的事…

spine to unity-2.利用边缘框实现实时碰撞检测

主要讲spine的边缘框&#xff0c;在unity中&#xff0c;实现实时碰撞检测。其中使用的素材&#xff0c;是我为独立游戏ink制作的动画。独立游戏ink的开发日志&#xff0c;在小红薯持续更新中。spine工具包的安装&#xff0c;下载请参考spine to unity-1spine BoundingBoxFollow…