Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解STL中的迭代器 C++中的迭代器是什么?_C++_Stl_Iterator - Fatal编程技术网

理解STL中的迭代器 C++中的迭代器是什么?

理解STL中的迭代器 C++中的迭代器是什么?,c++,stl,iterator,C++,Stl,Iterator,在我的例子中,我使用的是一个列表,我不明白为什么必须使用迭代器std::list::const_迭代器iElementLocator通过derefrence运算符显示列表内容: cout迭代器已经有很多很好的解释了。只需谷歌一下 一个 如果你有什么不明白的地方,回来问问 我太懒了。因此,我不会键入描述迭代器是什么以及如何使用迭代器的内容,特别是当您可以自己阅读大量在线文章时 以下是我可以引用的一些文章,提供完整文章的链接: 说, 迭代器是 指针,从它们的 以允许 用C++程序进行不同的工作 以统

在我的例子中,我使用的是一个
列表
,我不明白为什么必须使用迭代器
std::list::const_迭代器iElementLocator
通过derefrence运算符显示列表内容:

cout迭代器已经有很多很好的解释了。只需谷歌一下

一个


如果你有什么不明白的地方,回来问问

我太懒了。因此,我不会键入描述迭代器是什么以及如何使用迭代器的内容,特别是当您可以自己阅读大量在线文章时

以下是我可以引用的一些文章,提供完整文章的链接:

说,

迭代器是 指针,从它们的 以允许 用C++程序进行不同的工作 以统一的方式创建数据结构。 迭代器充当中介 在容器和泛型之间 算法。而不是在 具体的数据类型、算法是 定义为在某一范围内操作 由迭代器类型指定。任何 满足以下条件的数据结构: 然后,迭代器的需求可能会增加 由算法进行操作。那里 有五种类型或类别的 迭代器[…]

顺便说一下,似乎MSDN已经从C++标准本身中获取了粗体文本,特别是从<24/1/1的段落表示

迭代器是 允许C++程序运行的指针 使用不同的数据结构 (容器)以统一的方式。 能够构造模板 正确运行的算法 有效地处理不同类型的数据 结构,则库不会正式化 不仅是界面,还有 语义和复杂性假设 迭代器的定义。我支持的所有迭代器 表达式*i,导致 某个类、枚举或 内置类型T,称为值类型 迭代器的。我所需要的所有迭代器 表达式(*i).m是什么 定义良好,支持表达式 i->m的语义与 (*i.m。对于的每个迭代器类型X 定义了哪个等式,就有一个 对应有符号积分型 调用的差异类型 迭代器

说,

在C++中,迭代器是任何对象 指的是 元素的范围(例如数组或 容器),能够 迭代该元素 使用一组运算符的范围(在 至少,增量(++)和 取消引用(*)运算符)

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

您还可以阅读以下内容:

  • (在wiki条目中)

请耐心阅读所有这些。希望你能知道C++中迭代器是什么。学习C++需要耐心和时间。P> >我建议阅读C++中的运算符重载。这将说明为什么
*
->
基本上可以表示任何东西。只有这样,您才应该了解迭代器。否则它可能会显得非常混乱。

迭代器对于STL容器就像指针指向数组一样。您可以将它们视为指向STL容器的指针对象。作为指针,您可以将它们与指针符号一起使用(例如,
*iElementLocator
iElementLocator++
)。作为对象,它们将有自己的属性和方法(http://www.cplusplus.com/reference/std/iterator).

迭代器与容器本身不同。迭代器引用容器中的单个项,并提供访问其他项的方法

考虑在没有迭代器的情况下设计自己的容器。它可以有一个
size
函数来获取它所包含的项目数量,并且可以重载
[]
操作符以允许您根据项目的位置获取或设置项目

但是,在某些类型的容器上,这种“随机访问”并不容易有效地实现。如果您获得第一百万个项目:
c[1000000]
,并且容器内部使用链接列表,它将必须扫描一百万个项目才能找到您想要的项目

您可以改为允许集合记住“当前”项。它可以具有类似于
start
more
next
的功能,以允许您循环浏览以下内容:

c.start();
while (c.more()) 
{
    item_t item = c.next();

    // use the item somehow
}
但这会将“迭代状态”放入容器中。这是一个严重的限制。如果要将容器中的每个项目与其他项目进行比较,该怎么办?这需要两个嵌套循环,都迭代所有项。如果容器本身存储了迭代的位置,您就没有办法嵌套两个这样的迭代-内部循环将破坏外部循环的工作

因此迭代器是迭代状态的独立副本。您可以开始迭代:

container_t::iterator i = c.begin();
迭代器,
i
,是一个单独的对象,表示容器中的一个位置。您可以获取存储在该位置的任何内容:

item_t item = *i;
您可以移动到下一个项目:

i++;
使用某些迭代器,您可以向前跳过几个项目:

i += 1000;
或者在与迭代器标识的位置相关的某个位置获取项:

item_t item = i[1000];
使用一些迭代器可以向后移动

通过将迭代器与
end
进行比较,您可以发现您是否已经超出了容器的内容:

while (i != c.end())
您可以将
end
视为返回一个迭代器,该迭代器表示容器中超出最后一个位置的位置

<> Py>用迭代器(通常在C++中)知道的一个重要点是它们可能变得无效。例如,如果清空一个容器,通常会发生这种情况:指向该容器中位置的任何迭代器现在都变得无效。在那个州,大多数歌剧
template<class In, class Out>
Out copy(In first, In last, Out res)
{
    while( first != last ) {
        *res = *first;
        ++first;
        ++res;
    }
    return res;
}