Iterator是什么
简单的来说,iterator是C++中容器的访问接口,在STL不需要关心容器内如何实现的,C++标准库中有五种预定义的迭代子,其中功能最为强大的是随机访问迭代子,在上次博文中提到了输入流迭代器和输出流迭代器,在标准库定义中五种迭代子越往下功能越强大,但是不会继承。
上次博文中对于泛式算法的分类并没有提到,这次简明提一下:
泛式算法通常是返回一个迭代子,使用迭代子间接操作容器元素,泛式算法分为以下几种:
- 变化序列算法
- 非变化序列算法
- 数字型算法
现在我们看一看迭代器分类及其作用
基本迭代器 //正序 逆序 普通 常量
系统提供的四种迭代器:
- iterator
- reverse_iterator//反向遍历变量数据
- const_iterator
- const_reverse//反向遍历常量数据
我们以遍历函数作为例子来介绍四种迭代器:
template<typename Container>//遍历数据
void Show(Container& con)
{
Container::iterator it = con.begin();
while (it != con.end())
{
std::cout << *it << " ";
it++;
}
std::cout << std::endl;
}
我们知道,迭代器是容器的外部接口,在上面这个例子中,使用容器自带的begin()接口返回首元素的迭代器类型,从而遍历整个容器,可以看到我们使用了函数模板操作,这可以让本函数适用于所有顺序容器(关联容器因为内存不连续,所以无法++操作)
template <typename Container>//遍历常量数据,表示数据的值不能改变
void Show(const Container& con)
{
Container::const_iteraior it = con.begin();
while(it != con.end())
{
std::cout<<*it<<" "'
}
std::cout<<std::endl;
}
template <typename Continer>
void Show(const Continer& con)
{
Continer::iterator it = con.begin();//此时运行到此行会报错,因为普通指针指向一个const修饰的容器对象
这会有修改的风险,是不可以的。
}
template <typename Continer>
void Show(const Continer& con)
{
const Continer::iterator it = con.begin();//此时运行到此行会报错,这里的const表示it的指向不能变,但是值可以变
所以不能使用
这会有修