可以(重新)分配来自不同容器的迭代器吗?

alf*_*lfC 5 c++ iterator range assignment-operator c++-concepts

无法比较来自不同容器的迭代器(例如,请参见此处:https : //stackoverflow.com/a/4664519/225186)(或者从技术上讲,它不需要有意义。)

这就提出了另一个问题,来自不同范围的迭代器可以相互分配吗?

Container A = ...;
Container B = ...;
auto it1 = A.begin();
it1 = B.begin(); // it1 first belonged to A, does it1 need to belong to B later 
Run Code Online (Sandbox Code Playgroud)

迭代器概念是否需要在某些标准或公认的实践或即将到来的标准范围内工作的最后一行?

由于相等和赋值是如此交织在一起,似乎如果相等 ( ==) 并不总是很好地定义,那么赋值 ( =) 也不需要很好地定义,并且可能出于类似的潜在原因。

我问的原因并不纯粹是学术性的,因为某个迭代器实现可能具有来自容器的一些“元数据”,并且(取决于实现)可能会或可能无法重新分配,或者只是重新分配的浪费。(例如,A 独有的步幅信息,与 B 的步幅信息不一致。另一个例子是迭代器存储对原始范围的引用时。)

这可以允许在尝试分配时,特定字段(成员)可能保持不变。在某些情况下可以使分配工作,这可能会产生较少的惊喜,但它也可能限制实现,问题是是否真的有必要定义/允许不同来源(出处)的迭代器之间的分配?


2021 年更新:

链接的文件内容如下:

[...] 术语 == 的域在普通数学意义上用于表示(需要)定义 == 的值集。这个集合可以随着时间的推移而改变。每个算法对其使用的迭代器值的 == 域都提出了额外的要求。这些要求可以从算法对 == 和 != 的使用中推断出来。

所以有一个隐式定义的(由算法) 的有效性范围== 。表述这个问题的另一种方式是,是否==可以通过简单的逻辑使用,对 的适用范围应用相同的警告=

潜在的想法是,==孤立地定义=或反之亦然是没有意义的。(也因为我发现了一个激励案例)。

Ala*_*les 1

如果您查看 cppreference.com 查找您感兴趣的容器,您可以找到其迭代器的要求。

例如,如果我们看一下std::vector,它的迭代器被指定为LegacyRandomAccessIterator。如果您遵循从那里到基础的定义层次结构,LegacyIterator您将看到迭代器是必需的,CopyAssignable这意味着您必须能够将一个迭代器分配给另一个相同类型的迭代器。

所有标准库容器都使用派生自 的迭代器LegacyIterator,来自其他库的容器或容器可以自由地忽略这些要求,但如果迭代器不是这样,用户会感到非常惊讶,CopyAssignable如果迭代器仅不在CopyAssignable同一容器之间,则更令人惊讶类型,因为这可能只是运行时失败,而不是编译时失败。