gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:08:06 27 4
gpt4 key购买 nike

无法比较来自不同容器的迭代器(参见这里的示例: 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
迭代器概念是否需要在某些标准或公认的实践或即将到来的标准范围内工作的最后一行?
由于平等和赋值是如此交织,似乎如果平等( == )并不总是很好地定义,那么赋值( = )也不需要很好地定义,并且可能出于类似的潜在原因。
我问的原因并不纯粹是学术性的,因为某个迭代器实现可能具有来自容器的一些“元数据”,并且(取决于实现)可能会或可能无法重新分配,或者只是重新分配的浪费。
(例如,A 独有的步幅信息与 B 的步幅信息不一致。
另一个例子是当迭代器存储对原始范围的引用时。)
这可以允许在尝试分配时,特定字段(成员)可能保持不变。
在某些情况下可以使分配工作,这可能会产生较少的惊喜,但它也可能限制实现,问题是 是否真的有必要定义/允许不同来源(出处)的迭代器之间的分配?

2021 年更新:
链接的文件内容如下:

[...] the term the domain of == is used in the ordinary mathematicalsense to denote the set of values over which == is (required to be)defined. This set can change over time. Each algorithm placesadditional requirements on the domain of == for the iterator values ituses. These requirements can be inferred from the uses that algorithmmakes of == and !=.


所以有一个隐式定义的(由算法)有效性范围 ==.
表述这个问题的另一种方法是,是否对 == 的适用领域有相同的警告。可以通过简单的逻辑使用应用于 = .
基本思想是定义 ==隔离 =反之亦然没有意义。
(也因为我发现了一个激励案例)。

最佳答案

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

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

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

关于c++ - 可以(重新)分配来自不同容器的迭代器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62242618/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com