了解STL中的迭代器

Gri*_*fin 9 c++ iterator stl

嗨,所以我有点困惑迭代器和它们实际上是......在C++ STL中

在这种情况下我使用列表,我不明白你为什么要做一个迭代器:
std::list <int>::const_iterator iElementLocator;

由derefrence运算符dipslay列表的内容:
cout << *iElementLocator;

将它分配给list.begin()之后;

请解释一下迭代器究竟是什么以及我为什么要使用它/使用它!
谢谢!!

wil*_*ell 22

STL有三个构建块:

  • 集装箱
  • 算法
  • 迭代器

在概念层面,容器保存数据.这本身并不是很有用,因为你想对数据做些什么; 你想操作它,操纵它,查询它,玩它.算法就是这样做的.但是算法不持有数据,他们没有数据-他们需要一个容器完成这个任务.为容器提供一个容器,然后您就可以继续操作了.

从技术角度来看,唯一需要解决的问题是算法如何遍历容器.从技术上讲,容器可以是链表,也可以是数组,二叉树或任何其他可以保存数据的数据结构.但遍历数组与遍历二叉树的方式不同.尽管概念上所有算法都希望从容器中一次"获取"一个元素,然后处理该元素,但从容器中获取下一个元素的操作在技术上是非常容器特定的.

看起来好像你需要为每个容器编写相同的算法,因此每个版本的算法都有正确的代码来遍历容器.但是有一个更好的解决方案:让容器返回一个可以遍历容器的对象.该对象将具有已知的接口算法.当算法要求对象"获取下一个元素"时,对象将遵守.因为对象直接来自容器,所以它知道如何访问容器的数据.并且因为该对象具有算法所知的接口,所以我们不需要为每个容器复制算法.

这是迭代器.

这里的迭代器算法粘贴到容器上,而不将两者耦合.迭代器耦合到容器,算法耦合到迭代器的接口.这里魔术的来源实际上是模板编程.考虑标准copy()算法:

template<class In, class Out>
Out copy(In first, In last, Out res)
{
    while( first != last ) {
        *res = *first;
        ++first;
        ++res;
    }
    return res;
}
Run Code Online (Sandbox Code Playgroud)

copy()算法将两个在类型上模板化的迭代器In和一个类型的迭代器作为参数Out.它复制起始位置的元素first,只是位置前结束last,进入res.该算法知道要获得它需要说的下一个元素++first++res.它知道要读取它需要说x = *first的元素并写一个它需要说的元素*res = x.这是接口算法假设和迭代器提交的一部分.如果错误地迭代器不符合接口,那么编译器会在类型上调用函数时发出错误,In或者Out当类型没有定义函数时.

  • 这可能是高级描述 STL 的最佳方式之一,谢谢! (3认同)

Naw*_*waz 6

我很懒.所以我不打算描述迭代器是什么以及它们是如何被使用的,特别是当你已经有大量在线文章可以自己阅读时.

这里有一些我可以引用的开头,可以提供完整文章的链接:

MSDN说,

迭代器是指针的泛化,从它们的需求中抽象出来,允许C++程序以统一的方式处理不同的数据结构.迭代器充当容器和通用算法之间的中介.算法不是对特定数据类型进行操作,而是定义为在迭代器类型指定的范围内操作.然后,算法可以操作满足迭代器要求的任何数据结构.迭代器有五种类型或类别[...]

顺便说一句,似乎MSDN已经从C++标准本身采用粗体文本,特别是从§24.1/ 1部分说

迭代器是指针的泛化,允许C++程序以统一的方式处理不同的数据结构(容器).为了能够构建在不同类型的数据结构上正确有效工作的模板算法,该库不仅形式化了接口,还形成了迭代器的语义和复杂性假设.所有迭代器都支持表达式*i,从而产生一些类,枚举或内置类型T的值,称为迭代器的值类型.表达式(*i).m定义明确的所有迭代器i都支持表达式i-> m,其语义与(*i).m相同.对于定义了相等性的每个迭代器类型X,都有一个相应的有符号整数类型,称为迭代器的差异类型.

cplusplus说,

在C++中,迭代器是指向一系列元素(例如数组或容器)中的某个元素的任何对象,它能够使用一组运算符迭代该范围的元素(至少, increment(++)和dereference(*)运算符).

最明显的迭代器形式是指针[...]

你也可以阅读这些:

有耐心并阅读所有这些.希望您能在C++中了解迭代器是什么.学习C++需要耐心和时间.