1
5
好吧,我们有两个相似但不同的概念。所以让我们把它们摆出来。 但首先,我需要区分c++pre-20的命名需求和为ts范围创建并包含在c++20中的实际语言概念。它们都被称为“概念”,但它们被定义为 不同的 是的。因此,当我谈到concept-with-a-lowercase-c时,我指的是c++20之前的需求。当我谈到concept-with-a-captial-c时,我指的是c++20之类的东西。 代理迭代器
代理迭代器是迭代器,其中
输入者概念不要求
因此,代理迭代器不能适应forwarditerator概念。但是 可以 还是个输入者。因此,您可以安全地将代理迭代器传递给任何只需要inputiterators的函数。
所以,问题是
c++20中采用的ranges建议(大多)对迭代器概念进行了更改,这些概念允许代理迭代器用于
全部的
迭代器。所以在范围内,
这对于处理计数范围之类的事情非常有用。你可以
当然,如果你能控制使用迭代器的代码,你可以让它做你想做的任何事情,只要你不违反迭代器的概念。 隐藏迭代器
隐藏迭代器是迭代器,其中
隐藏迭代器通常是实现的,因为计算要返回的值非常昂贵。可能会涉及到内存分配(例如
作为一个概念(或概念),转发迭代器的基础之一是这些迭代器的范围代表存在于值之上的范围。 独立地 他们的迭代器。这允许多路径操作,但也使其他操作变得有用。您可以存储对范围内项的引用,然后在其他地方迭代。 如果需要迭代器作为forwarditerator或更高版本,则应该 从未 使它成为一个隐藏迭代器。当然,c++标准库并不总是与自身保持一致。但它通常会说出它的不一致之处。
现在,这并不意味着你不能把它传递给任何人。任何只需要inputiterator的算法都可以使用这样的迭代器,因为这样的代码不能依赖于该规则。当然,可以使用您编写的任何代码,或者在文档中特别声明它不依赖于该规则的任何代码。但不能保证你能用
注意,我没有区分pre-c++20概念和ranges概念。这是因为forwarditerator概念仍然禁止隐藏迭代器。 This is by design. 用法很明显,你可以在代码中做任何你想做的事情。但你无法控制的代码将归其所有者所有。他们将针对旧的概念、新的概念或他们指定的其他c/概念或需求进行编写。所以迭代器需要能够与它们的需求兼容。 ranges加法带来的算法使用了新的概念,因此您可以始终依赖它们来使用代理迭代器。然而,据我所知,范围概念是 不 后移植到旧算法中。 就我个人而言,我建议不要完全隐藏迭代器实现。通过提供对代理迭代器的完全支持,大多数隐藏迭代器都可以重写以返回 价值观 而不是对对象的引用。
例如,如果
现在,隐藏迭代器以一种有用的方式处理缓存;迭代器可以缓存其结果,以便重复
当然,所有这些都意味着
|
Julia · 矢量中相加为总和S的值的数量 1 年前 |
apetrai · 我应该如何假设算法使用哪种迭代器类别? 2 年前 |
Pratik · 不使用Java DeepCopy迭代器 6 年前 |
PanDe · 将两个列表合并为一个Dict、Tuple 6 年前 |
bisarch · 迭代哈希集并在每次迭代中删除多个元素 6 年前 |