【C++】STL系列(3):迭代器Iterator

本文介绍了STL中的迭代器,作为算法与容器之间的桥梁,迭代器有五种类型:只读、只写、单项、双向和随机访问。迭代器提供了必要的信息给算法,包括指针和引用类型等。通过迭代器traits,非类迭代器(如指针)也能提供所需信息。文章还提及了算法如何获取这些信息,并概述了不同容器选择的迭代器种类,以及迭代器的辅助函数,强调了迭代器重载操作符的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

–本文章来自侯捷老师的STL课程和自己的理解

如有错误,欢迎指出

这里我打算打乱老师的讲课顺序,因为毕竟是总结性质的文章,我觉得先介绍迭代器会比较好。

迭代器是链接算法和容l器的桥梁。算法对容器里面的一切都一无所知,他所需要的一切信息都由Iterator提供。

迭代器有五种(种类):
struct input_iterator_tag{};(只读迭代器)
struct output_iterator_tag{};(只写迭代器)
struct forward_iterator_tag:public input_iterator_tag{};(单项迭代器)
struct bidirectional_iterator_tag:public forward_iterator_tag{};(双向迭代器)
struct random_access_iterator_tag:public bidirectional_iterator_tag{};(随机迭代器)

同时,每个迭代器需要具有如下的信息(一般用typedef来提供)提供给算法:
在这里插入图片描述
注:reference_type和pointer_type从未使用过,但是依旧需要定义出来。

定义迭代器的时候,又具有以下的种类(这和迭代器类型是不冲突的,一个是在定义的时候需要的使用方式,一种是它本质上是个什么迭代器)。
在这里插入图片描述
但是有一些迭代器不是类,比如说指针,那么怎么提供上面需要的那五种信息呢?这个时候就要用到Iterator traits来提供这些信息
可以将traits理解为一个加工厂,进去的类型在加工过后都会提供一样的信息类型。
在这里插入图片描述

实现原理其实也是泛化和偏特化的使用,针对不同的输入类型不同处理。
在这里插入图片描述
在这里插入图片描述
而算法内部去获取这些信息的时候,就是通过对应的名称去获取的,例如这样:
在这里插入图片描述
容器所选取的迭代器种类大致如下:
在这里插入图片描述

顺便提一下迭代器的辅助函数:
在这里插入图片描述
注:因为迭代器需要像指针一样使用,其内部一定是重载了大量操作符的。

出现这个错误的原因是在导入seaborn包时,无法从typing模块中导入名为'Protocol'的对象。 解决这个问题的方法有以下几种: 1. 检查你的Python版本是否符合seaborn包的要求,如果不符合,尝试更新Python版本。 2. 检查你的环境中是否安装了typing_extensions包,如果没有安装,可以使用以下命令安装:pip install typing_extensions。 3. 如果你使用的是Python 3.8版本以下的版本,你可以尝试使用typing_extensions包来代替typing模块来解决该问题。 4. 检查你的代码是否正确导入了seaborn包,并且没有其他导入错误。 5. 如果以上方法都无法解决问题,可以尝试在你的代码中使用其他的可替代包或者更新seaborn包的版本来解决该问题。 总结: 出现ImportError: cannot import name 'Protocol' from 'typing'错误的原因可能是由于Python版本不兼容、缺少typing_extensions包或者导入错误等原因造成的。可以根据具体情况尝试上述方法来解决该问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [ImportError: cannot import name ‘Literal‘ from ‘typing‘ (D:\Anaconda\envs\tensorflow\lib\typing....](https://blog.youkuaiyun.com/yuhaix/article/details/124528628)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值