17.1迭代器
标准库通过迭代器模式提供了访问容器元素使用的泛型抽象。每个容器都提供了容器特定的迭代器,迭代器实际上是增强版的智能指针,这种指针知道如何遍历特定容器的元素,也就是说,迭代器支持遍历容器的元素。所有不同容器的迭代器都遵循C++标准中定义的特定接口。因此, 即使容器提供不同的功能,访问容器元素的代码也可以使用迭代器的统一接口。
所有迭代器都必须可通过复制来构建、赋值,并且是可以析构的。迭代器的左值必须是可以交换的。不同容器提供的迭代器具有略微不同的功能.
1.获取容器的迭代器
标准库中每个支持迭代器的容器类都为其迭代器类型提供了公共类型别名,名为iterator
和const_iterator
。允许反向迭代元素的容器还提供了名为reverse_iterator
和const_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_tag
、output_iterator_tag
、forward_iterator_tag
、bidirectional_iterator_tag
、random_access_iterator_tag
或contiguous_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;
}