C++ 迭代器(iterator)

news2024/11/29 22:50:13

迭代器介绍

迭代器(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,...0
    return 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.coloradmin.cn/o/1052020.html

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

相关文章

LaTex的学习(学习于b站西北农林科技大学耿楠教授的教学视频)

目录 一、LaTeX软件的安装与环境配置  1.LaTeX软件texlive的下载  2. texlive的安装 二、用命令行实现LaTeX文档的编写  1.通过命令行演示LaTeX编写的过程  2.将编译LaTeX并生成pdf文件的过程封装成一个bat文件  3.演示一个含有中文的LaTeX文件 三、用TexStudio IDE实…

性格孤僻怎么办?改变性格孤僻的4种方法

性格孤僻是比较常见的说法&#xff0c;日常中我们说某人性格孤僻&#xff0c;意思就是这人不太合群&#xff0c;喜欢独来独往&#xff0c;话少&#xff0c;人际关系不太好&#xff0c;其言行往往不符合大众的价值观。从性格孤僻的角度来看&#xff0c;可能跟很多种心理疾病存在…

布隆过滤器Bloom Filter

本章代码gitee仓库&#xff1a;布隆过滤器 文章目录 0. 前言1. 布隆过滤器的概念2. 布隆过滤器的实现2.1 哈希函数2.2 插入和判断 3. 布隆过滤器的删除4. 布隆过滤器的误判 0. 前言 我们在玩某款游戏的时候&#xff0c;刚注册的话&#xff0c;我们需要取一个昵称&#xff0c;这…

Kafka:安装与简单使用

文章目录 下载安装windows安装目录结构启动服务器创建主题发送一些消息启动消费者设置多代理集群常见问题 工具kafka tool 常用指令topic查看topic删除topic 常见问题参考文献 下载安装 下载地址&#xff1a;kafka-download windows安装 下载完后&#xff0c;找一个目录解压…

inndy_echo

inndy_echo Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)32位&#xff0c;只开了NX int __cdecl __noreturn main(int argc, const char **argv, const char **envp) {char s; // [espCh…

微信小程序引入字体在部分机型失效不兼容解决办法

写小程序页面&#xff0c;美工作图用了特殊字体 引入代码&#xff1a; font-face {font-family: huxiaobo;src: url("https://xxxxxxxx.top/assets/fonts/huxiaobonanshenti.woff") } .font-loaded {font-family: "huxiaobo"; } 上线后发现部分安卓机型不…

Java下Properties类的使用(写出和读入)

代码如下&#xff1a; public class MyWork {public static void main(String[] args) throws IOException {Properties pro1 new Properties();pro1.setProperty("0001","张三");pro1.setProperty("0002","李四");pro1.setProperty…

1600*E. Kolya and Movie Theatre(贪心优先队列规律)

Kolya and Movie Theatre - 洛谷 Problem - 1862E - Codeforces 解析&#xff1a; 可以观察到每次看电影所减少的舒畅值都和前一次有关&#xff0c;这样的话&#xff0c;可以发现减少的 d 只和最后一次看电影的时间有关。 所以枚举最后一次看电影的时间&#xff0c;并且维护一…

iOS设备管理器iMazing比iTunes好用吗?有哪些优势

虽然 iTunes 是 Apple 官方指定的 iPhone 数据备份和管理工具&#xff0c;但是一直以来 iTunes 卡顿的使用体验和过慢的备份过程为不少人诟病。如果大家也被 iTunes 体验不佳的备份和管理功能所困扰&#xff0c;那么简单易用、功能强大的iMazing 能为你解决这个问题。 iMazing…

java web+Mysql e-life智能生活小区物业管理系统

本项目为本人自己书写&#xff0c;主要服务小区业主和管理人员。 e-life智能生活小区涉及多个方面的智能化和便利化服务&#xff1a; 1. 用户模块&#xff1a;包含基本的登入登出操作&#xff0c;查看个人信息中用户可以查看 自己的个人资料但不可以修改个人信息。 a) 用户…

从零开始学习 Java:简单易懂的入门指南之IO字节流(三十)

IO流之字节流 1. IO概述1.1 什么是IO1.2 IO的分类1.3 IO的流向说明图解1.4 顶级父类们 2. 字节流2.1 一切皆为字节2.2 字节输出流【OutputStream】2.3 FileOutputStream类构造方法写出字节数据数据追加续写写出换行 2.4 字节输入流【InputStream】2.5 FileInputStream类构造方法…

自学成为一名黑客(自学笔记)

前言&#xff1a; 想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“…

Armv9 Cortex-A720的L2 memory system 和 L2 Cache

9 L2 memory system Cortex-A720核心的L2内存系统通过CPU bridge连接core与DynamIQ Shared Unit-120,其中包括私有的L2缓存。 L2缓存是统一的,每个Cortex-A720核心在一个集群中都有私有的L2缓存。 L2内存系统包括使用虚拟地址(VA)和程序计数器(PC)的数据预取引擎。不同…

C++——函数指针与指针函数

函数指针与指针函数 1. 初识 一个区分的小技巧&#xff1a; “函数指针”中函数是用来修饰指针的&#xff0c;所以主体是指针&#xff0c;它主要是用来指向函数的。 “指针函数”中指针是用来修饰函数的&#xff0c;所以主体是函数&#xff0c;该函数的返回类型是指针。 举个…

A1048 Find Coins(测试点1)

Sample Input 1: 8 15 1 2 8 7 2 4 11 15 Sample Output 1: 4 11 Sample Input 2: 7 14 1 8 7 2 4 11 15 Sample Output 2: No Solution idea 测试点1&#xff1a;m比i小的情况处理小细节&#xff1a;i m/2时&#xff0c;注意i的出现次数必须大于一次 solution #in…

【数据结构--八大排序】之冒泡排序+选择排序+插入排序

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

【数据库——MySQL】(13)过程式对象程序设计——存储函数、错误处理以及事务管理

目录 1. 存储函数2. 存储函数的应用3. 错误处理4. 抛出异常5. 事务处理6. 事务隔离级7. 应用实例参考书籍 1. 存储函数 要 创建 存储函数&#xff0c;需要用到 CREATE 语句&#xff1a; CREATE FUNCTION 存储函数名([参数名 类型, ...])RETURNS 类型[存储函数体]注意&#xff1…

ESP32IDF — 硬件I2C使用教程

前言 &#xff08;1&#xff09;最近刚做完ESP32的一个模块的驱动移植&#xff0c;使用到了I2C。感觉ESP32的硬件I2C还是挺容易使用的。 &#xff08;2&#xff09;本文将只会介绍ESP32的硬件I2C使用&#xff0c;如果想知道软件I2C使用&#xff0c;可看其他的任意一款芯片软件I…

双指针算法——移动零

双指针算法——移动零&#x1f60e; 前言&#x1f64c;题目详情&#xff1a;图解分析&#xff1a;代码分享&#xff1a;B站讲解视频链接&#xff1a; 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧…

数据集笔记:华盛顿共享单车OD数据

2010~2022 共享单车OD数据 数据地址&#xff1a;Index of bucket "capitalbikeshare-data"