17.1迭代器

17.1迭代器


标准库通过迭代器模式提供了访问容器元素使用的泛型抽象。每个容器都提供了容器特定的迭代器,迭代器实际上是增强版的智能指针,这种指针知道如何遍历特定容器的元素,也就是说,迭代器支持遍历容器的元素。所有不同容器的迭代器都遵循C++标准中定义的特定接口。因此, 即使容器提供不同的功能,访问容器元素的代码也可以使用迭代器的统一接口。

所有迭代器都必须可通过复制来构建、赋值,并且是可以析构的。迭代器的左值必须是可以交换的。不同容器提供的迭代器具有略微不同的功能.

1.获取容器的迭代器

标准库中每个支持迭代器的容器类都为其迭代器类型提供了公共类型别名,名为iteratorconst_iterator。允许反向迭代元素的容器还提供了名为reverse_iteratorconst_reverse_iterator的公共类型别

容器还提供了begin())和end()方法。begin()方法返回引用容器中第一个元素的迭代器,end0方法返回的迭代器等于在引用序列中最后一个元素的迭代器上执行operator++后的结果。begin()end()一起提供了一个半开区间(half-open-range),包含第一个元素但不包含最后一个元素。采用这种看似复杂方式的原因是为了支持空区间(不包含任何元素的容器),此时begin()等于end()。由begin()end()限定的半开区间常写成数学形式∶[begin,end)

此外,还可以使用以下方法∶

  • 返回_const_迭代器的cbegin()cend()方法
  • 返回反向迭代器的rbegin()和_rend()方法
  • 返回const_反向迭代器的crbegin()crend()方法

<iterator>头文件中还提供了如表17-2所示的全局非成员函数来查找容器中的特定迭代器。

在这里插入图片描述

还可使用std::distance()计算容器的两个迭代器之间的距离。

2.迭代器萃取

一些算法实现需要关于迭代器的附加信息。C++提供了一个名为_iterator_traits_的类模板,定义在<iterator.h>头文件中,它允许用户查找这些信息。可以使用感兴趣的迭代器类型来实例化iterator_traits类模板,并访问5个类型别名中的一个。

  • value_type∶引用的元素类型
  • difference_type∶一种能够表示距离的类型,例如,两个迭代器之间的元素的数量
  • iterator_category∶迭代器的类型是input_iterator_tagoutput_iterator_tagforward_iterator_tagbidirectional_iterator_tagrandom_access_iterator_tagcontiguous_iterator_tag(C++20)
  • 指针∶指向元素的指针类型
  • 引用∶元素引用的类型

注:每当访问基于一个或多个模板类型参数的类型时,必须显式指定typename.

template<typename IteratorType>
void iteratorTraitsTest(IteratorType it)
{
    typename std::iterator_traits<IteratorType>::value_type temp;
    temp = *it;
    std::cout<<temp<<std::endl;
}
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值