C++中STL迭代器如何使用

1.概念

迭代器是一种检查容器内元素并遍历元素的数据类型。 C++ 更趋向于使用迭代器而不是下标操作,因为标准库为每一种标准容器(如vector )定义了一种迭代器类型,而只用少数容器(如 vector )支持下标 操作访问容器元素。 C++中的迭代器是对指针的封装,迭代器提供特定的函数让调用者对指针进行特定的安全的操作。

2.定义和初始化

每种容器都定义了自己的迭代器类型,如 vector的迭代器  vector<int>::iterator iter;  //定义一个名为 iter 的迭代器变量。
每种容器都定义了一对名为 begin end 的函数,用于返回迭代器。
迭代器初始化操作:
vector<int> ivec;
// 将迭代器 iter1 初始化为指向 ivec 容器的第一个元素
vector<int>::iterator iter1=ivec.begin();
// 将迭代器 iter2 初始化为指向 ivec 容器的最后一个元素的下一个位置
vector<int>::iterator iter2=ivec.end();
注意:
       end 并不指向容器的任何元素, 而是指向容器的最后元素的下一位置,称为超出末端迭代器。 如果vector 为空,则 begin 返回的迭代器和 end 返回的迭代器相同。 一旦向上面这样定义和初始化,就相当于把该迭代器和容器进行了某种关联,就像把一个指针初始化为指向某一空间地址一样。

 示例:使用迭代器输出容器中的元素

vector<int>::iterator iter;
//for(int i = 0; i< 10; i++)
//begin是容器的头元素 ,end并不是尾元素,而是无效的元素表示容器结束
for(iter = v.begin(); iter != v.end(); iter++)
{cout<<*iter<<" ";
}
cout<<endl;

3.常用操作 

*iter // iter 进行解引用,返回迭代器 iter 指向的元素的引用
iter->men // iter 进行解引用,获取指定元素中名为 men 的成员。等效于 (*iter).men
++iter // iter 1 ,使其指向容器的下一个元素
--iter // iter 1 ,使其指向容器的前一个元素
iter1==iter2 // 比较两个迭代器是否相等,当它们指向同一个容器的同一个元素时相等
示例: 100 以内能整除 2 的数都更改为 0, 输出最后的结果
int main()
{//2.创建容器 原理:数组原理 连续 [角标]vector<int> v;//默认方式初始化底层没有为其分配内存空间for(int i=0;i<100;i++)v.push_back(i);//迭代器遍历//begin是容器的头元素 ,end并不是尾元素,而是无效的元素表示容器结束vector<int>::iterator iter;for(iter=v.begin(); iter != v.end(); iter++){if(*iter%2==0)cout<<*iter<<" ";}cout<<endl;return 0;
}

4.迭代器遍历删除

示例:删除方法 v.erase(iter);
v.erase(pos); // 移除 pos 位置上的元素,返回下一个数据的位置
v.erase(begin, end); // 移除 [begin, end) 区间的数据,返回下一个元素的位置
注意:迭代器所指向的对象被删除后,迭代器就无效了, erase函数会返回一个新的迭代器,指向删除元素的下一个元素。
练习 1 :容器中保存数据 0~9,10,10 ,将其中的偶数删除
int main()
{//2.创建容器 原理:数组原理 连续 [角标]vector<int> v;//默认方式初始化底层没有为其分配内存空间for(int i=0;i<10;i++)v.push_back(i);//0~9 10 10v.push_back(10);v.push_back(10);//迭代器遍历 删除偶数//begin是容器的头元素 ,end并不是尾元素,而是无效的元素表示容器结束vector<int>::iterator iter;for(iter=v.begin(); iter != v.end(); ){if(*iter%2 == 0){//迭代器所指向的对象被删除后,迭代器就无效了,//erase函数会返回一个新的迭代器,指向删除元素的下一个元素iter = v.erase(iter);//已经指向最后一个}elseiter++;}for(int i=0;i<v.size();i++)cout<<v[i]<<endl;
}

5.查找迭代器删除

1 )加入头文件 #include <algorithm>
2 )查找方法为: vector<int>::iterator iter = find(v.begin(), v.end(), 3);
3 )注意: find 方法只能删除找到的第一个元素
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{vector<int> v;for(int i = 0;i < 10;i++){v.push_back(i);}vector<int>::iterator iter = find(v.begin(), v.end(), 3);v.erase(iter);for(vector<int>::iterator iter = v.begin();iter != v.end();iter++){cout<<*iter<<endl;}return 0;
}

6.容器添加自定义类型

#include <iostream>
#include <vector>
#include <algorithm>//算法头文件
using namespace std;
class Person
{int age;
public:Person(int age):age(age){}void show(){cout<<age<<endl;}};
int main()
{//自定义类型的容器vector<Person> v;//添加元素:3种方式Person p(1);//1.将对象装进容器v.push_back(p);Person p1(2);v.push_back(p1);//2.将匿名对象装进容器v.push_back(Person(3));//3.利用隐士转换方式 将对象装进容器v.push_back(4);for(int i=0 ; i< v.size(); i++)v[i].show();//v[i]-->pesron对象//迭代器遍历 调用show方法vector<Person>::iterator iter;for(iter=v.begin(); iter!=v.end(); iter++){iter->show();//(*iter).show();}return 0;
}

7.查找迭代器删除自定义类型

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Person
{int age;
public:Person(int a):age(a){}void show(){cout<<age<<endl;}bool operator ==(const Person& other){if(this->age == other.age)return true;elsereturn false;}
};
int main()
{vector<Person> v;Person p(10);v.push_back(p);//Person(10)v.push_back(Person(20));v.push_back(Person(30));vector<Person>::iterator it = find(v.begin(),v.end(),Person(20));if(it != v.end()){it->show();}elsecout<<"not"<<endl;for(vector<Person>::iterator iter = v.begin();iter != v.end(); iter++){(*iter).show();//iter->show();}
}

 结语

以上就是迭代器基本使用方法,本次代码分享到此结束,后续还会分享有关C++知识。

最后的最后,还请大家点点赞,点点关注,谢谢大家!

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

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

相关文章

半导体材料(二)——半导体导电特性

本篇为西安交通大学本科课程《电气材料基础》的笔记。 本篇为这一单元的第二篇笔记&#xff0c;上一篇传送门。 半导体导电特性 载流子的迁移 外电场下电子和空穴定向位移产生电流。电流密度可写作&#xff1a; J e ( μ n n μ p p ) E σ E Je(\mu_n n\mu_p p)E\sigm…

Swift中的运算符

Swift中的运算符可以分为以下几种&#xff1a; 算术运算符&#xff1a;用于执行基本的数学运算&#xff0c;如加法&#xff08;&#xff09;、减法&#xff08;-&#xff09;、乘法&#xff08;*&#xff09;、除法&#xff08;/&#xff09;和取余&#xff08;%&#xff09;等…

行式存储VS列式存储对比

行式存储&#xff1a; 一行代表一个记录的所有字段。 可以快速读取和写入单条记录。 如果要检索一条数据&#xff0c;数据库会读取or写入整条记录&#xff0c;包含所有相关字段。 列式存储&#xff1a; 表中每一列的数据连续存放。这种方式在需要对某一列进行大量运算或分析时…

「 典型安全漏洞系列 」14.NoSQL注入漏洞详解

NoSQL注入是一个漏洞&#xff0c;攻击者能够干扰应用程序对NoSQL数据库进行的查询&#xff0c;本文我们将研究如何测试一般的NoSQL漏洞&#xff0c;然后重点研究如何利用MongoDB中的漏洞&#xff08;MongoDB是最流行的NoSQL数据库&#xff09;。 1. 什么是NoSQL注入 NoSQL注入…

【C++语言】初步认识面向对象编程类和对象(上)

文章目录 前言一.初步认识面向过程和面向对象编程1.面向过程编程初步认识2.面向对象编程初步认识 二.C类1. 类的引入&#xff1a;2. 类的定义3.类的访问限定符&&封装3.1 访问限定符3.2 封装 4.类的实例化5.如何计算类的大小 总结C语言系列学习目录 前言 面向对象编程 类…

linux服务器配置conda和torch环境踩坑记录

anaconda环境安装torch时候报错 CondaValueError: Malformed version string ~: invalid character(s) 网上所有方法都试过,包括重新设置.condarc文件,换清华源 尝试更新conda conda update -n base conda,无法更新,还是报错上面的错 推测是版本过低导致 conda --version ,结…

什么数据集成(Data Integration):如何将业务数据集成到云平台?

说到数据集成&#xff08;Data Integration&#xff09;&#xff0c;简单地将所有数据倒入数据湖并不是解决办法。 在这篇文章中&#xff0c;我们将介绍如何轻松集成数据、链接不同来源的数据、将其置于合适的环境中&#xff0c;使其具有相关性并易于使用。 数据集成&#xff1…

今年消费新潮流:零元购商业模式

今天给大家推荐一种极具创新的电子商务模式&#xff1a;零元购商业模式 这个模式支持消费者以零成本或极低成本购买商品。这种模式主要通过返现、积分、优惠券等方式来减少支付金额&#xff0c;使消费者实现“零成本”购物的目标。 人民网在去年发表了一篇文章。 总结了一下&a…

设计模式学习笔记(知识点与代码实践)

文章目录 0 背景1 设计模式 0 背景 设计模式其实很早就想学习了&#xff0c;但是由于懒 &#xff0c;所以一直拖到现在。之前写项目也接触过一些零散的设计模型&#xff0c;却一直没有系统的学习过&#xff0c;这次就是系统的学习这方面的知识。 本文就是学习心得和代码实践的…

【基础物理实验】【AFM虚拟实验】基于AFM的物质表面微观结构及力学性质表征仿真实验(上)【北京航空航天大学】

基于AFM的物质表面微观结构及力学性质表征仿真实验 说明&#xff1a; 本次实验为本科生《基础物理实验》课程中的虚拟实验部分&#xff0c;在虚拟实验平台中进行。 一、实验目的&#xff1a; 1. 掌握AFM的基本成像原理及系统结构&#xff1b; 2. 掌握AFM的基本操作技巧及操…

stable diffusion本地部署教程

Stable Diffusion是一种生成模型&#xff0c;用于根据给定的文本输入生成图像。要在本地部署Stable Diffusion&#xff0c;您需要完成以下步骤&#xff1a; 安装依赖项 首先&#xff0c;确保您的计算机上已安装了Python&#xff08;推荐使用3.8或更高版本&#xff09;和pip。然…

EDA重新成为热点,中国正在成为参与者

EDA正在从一个沉淀已久的领域转变为一个热门的市场&#xff0c;这得益于市场中对定制设计的呼声&#xff0c;以及人工智能等先进技术的推出&#xff0c;这些工具将需要开发具有更高性能的芯片架构。 因为市场更需要定制芯片&#xff0c;这意味着更多的芯片设计工作正在发生&…

Semaphore

Semaphore 翻译&#xff1a; 信号量 解释&#xff1a; 信号量通常用于限制线程数&#xff0c;而不是访问某些&#xff08;物理或逻辑&#xff09;资源。 例如&#xff0c;这是一个使用信号量来控制对一个项目池的访问的类 用法 可以限制线程的使用次数 public static vo…

使用 Tranformer 进行概率时间序列预测实战

使用 Transformers 进行概率时间序列预测实战 通常&#xff0c;经典方法针对数据集中的每个时间序列单独拟合。然而&#xff0c;当处理大量时间序列时&#xff0c;在所有可用时间序列上训练一个“全局”模型是有益的&#xff0c;这使模型能够从许多不同的来源学习潜在的表示。…

HCIP的学习(9)

OSPF的接口网络类型 ​ OSPF的接口在某种网络类型下的工作方式。 网络类型OSPF接口的工作方式BMABroadcast&#xff1b;可以建立多个邻居关系。需要进行DR选举。hello 10S&#xff1b;dead 40S。P2PP2P&#xff1b;只能建立一个邻居关系&#xff0c;不需要进行DR选举。Hello …

操作系统:进程(二)

进程的状态 进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。在三态模型中&#xff0c;进程状态分为三个基本状态&#xff0c;即运行态&#xff0c;就绪态&#xff0c;阻塞态。 一个进程从创建而产生至撤销而消亡的整个生命期间&#xff0c;…

强化学习-Reinforcement learning | RL

目录 什么是强化学习? 强化学习的应用场景 强化学习的主流算法 强化学习是机器学习的一种学习方式,它跟监督学习、无监督学习是对应的。本文将详细介绍强化学习的基本概念、应用场景和主流的强化学习算法及分类。 什么是强化学习? 强化学习并不是某一种特定的算法,而是…

【好书推荐-第十五期】《 机器学习基础:从入门到求职》(博文视点出品)

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号&#xff1a;洲与AI。 &#x1f388; 本文专栏&#xff1a;本文收录…

python 重载内置函数吗

python中是不支持函数重载的&#xff0c;但在python3中提供了这么一个装饰器functools.singledispatch&#xff0c;它叫做单分派泛函数&#xff0c;可以通过它来完成python中函数的重载&#xff0c;让同一个函数支持不同的函数类型&#xff0c;它提供的目的也正是为了解决函数重…

CV最新论文|4月10日 arXiv更新论文合集

以下内容由马拉AI整理&#xff0c;今天为大家带来4月10日 arXiv 计算机视觉和模式识别相关论文&#xff1a; 1、InternLM-XComposer2-4KHD: A Pioneering Large Vision-Language Model Handling Resolutions from 336 Pixels to 4K HD InternLM-XComposer2-4KHD&#xff1a;一…