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

C++ 迭代器(iterator)

迭代器介绍

迭代器(iterator):容器类型内置的“指针”
- 使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另一个元素。
- 有迭代器的类型都拥有 begin 和 end 成员- begin:返回指向第一个元素(或字符)的迭代器- end:尾后迭代器,即尾元素的下一个位置(一个本不存在的元素) 

使用迭代器

auto b = v.begin(),e = v.end(); // b和e的类型相同

如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器

在这里插入图片描述
举个例子,下面利用迭代器实现

string s = "some string";
if(s.begin() != s.end()) { //确保s非空auto it = s.begin();  //it表示s的第一个字符*it = toupper(*it);   //将当前字符改成大写形式
}  //Some string

使用迭代器遍历容器

for(auto it = s.begin(); it != s.end() && !isspace(*it); ++it) {*it = toupper(*it);
}  // SOME string
  • 迭代器类型
vector<int>::iterator it;     //it能读写元素
vector<int>::const_iterator it2;//it2只能读元素,不可以写元素

如果vector或者string对象是一个常量,只能使用const_iterator;如果不是常量,则既能使用iterator也能使用const_iterator

  • 正序迭代
begin();end()   //iterator
cbegin();cend()  //const_iterator
  • 逆序迭代
rbegin();rend()  //reverse_iterator
int main() {vector<int> vec{0,1,2,3,4,5,6,7,8,9};vector<int>::reverse_iterator it;for (it = vec.rbegin();         // 迭代器指向最后一个元素it != vec.rend();          // rend() 指向第一个元素的前一个++it)					    // ++操作访问前一个元素cout << *it<< " ";    // prints 9,8,7,...0return 0;
}

迭代器解引用

vector<string> vec;
auto it = vec.begin();
(*it).empty()  //检查vector中的元素是否为空,只需检查it所指字符串是否为空
  • 箭头运算符(->)
it->mem & (*it).mem  表达的意思相同

WARNING

任何一种可能改变vector对象容量的操作,比如push_back,都会使该vector对象的迭代器失效。
但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。

迭代器运算

在这里插入图片描述
或者是两个迭代器相减,就可以得到中间隔了多少个元素。

使用迭代器运算的一个经典算法是二分搜索:

vector<int> text = {1,2,3,4,5};auto sought = 2;auto beg = text.begin(), end = text.end();auto mid = beg + (end - beg) / 2;   //初始状态的中间点while(mid != end && *mid != sought) {if(sought < *mid) end = mid;else beg = mid + 1;mid = beg + (end - beg) / 2;   //新的中间点}

循环过程终止时,mid或者等于end或者指向要找的元素。如果说mid等于end,说说明text中没有我们要找的元素。

http://www.lryc.cn/news/179805.html

相关文章:

  • 基于Python3搭建qt开发环境
  • Linux常见操作命令(1)
  • GEO生信数据挖掘(一)数据集下载和初步观察
  • Tensorflow2 GPU 安装方法
  • QSS之QLineEdit
  • 在比特币上支持椭圆曲线 BLS12–381
  • 简单讲解 glm::mat4
  • 第3章-指标体系与数据可视化-3.1.1-Matplotlib绘图库
  • 探索视听新纪元: ChatGPT的最新语音和图像功能全解析
  • 华为乾坤区县教育安全云服务解决方案(1)
  • 《Jetpack Compose从入门到实战》第三章 定制 UI 视图
  • Kubernetes组件和架构简介
  • ElementUI实现增删改功能以及表单验证
  • C++中有哪些运算符以及它们的优先级?
  • uboot启动流程-涉及_main汇编函数
  • 此芯科技加入百度飞桨硬件生态共创计划,加速端侧AI生态布局
  • Unity把UGUI再World模式下显示到相机最前方
  • nodejs+vue活鲜物流监控系统elementui
  • 数据集划分——train_test_split函数使用说明
  • Pytorch中关于forward函数的理解与用法
  • vite跨域proxy设置与开发、生产环境的接口配置,接口在生产环境下,还能使用proxy代理地址吗
  • 【嵌入式】使用MultiButton开源库驱动按键并控制多级界面切换
  • 【数据结构】树的概念理解和性质推导(保姆级详解,小白必看系列)
  • 融合之力:数字孪生、人工智能和数据分析的创新驱动
  • Spring的注解开发-Spring配置类的开发
  • Linux系统编程系列之进程间通信-信号量组
  • centos 6使用yum安装软件
  • maven无法下载时的解决方法——笔记
  • Java Spring Boot 开发框架
  • Pytorch学习记录-1-张量