【发布时间】:2020-10-05 20:01:53
【问题描述】:
在一对 std::vector 迭代器上调用 std::distance 的行为是否未定义,这些迭代器已因移动 vector 而无效?
对于上下文:
我正在为具有vector 数据和vector 指向该数据的迭代器的类编写复制和移动构造函数。一旦我将数据移动到它的目的地,我需要转换迭代器的向量以指向新的容器。我想避免在内存中创建中间索引表示。
【问题讨论】:
-
根据标准 - 不,因为一个迭代器不再可以从另一个迭代器访问。在实践中它可能会正常工作,但我不会以这种方式使用它。
-
@RinatVeliakhmedov “按照标准” 可以链接段落吗?
-
@ThomasSablik 我假设这里的 cppreference 部分来自标准 en.cppreference.com/w/cpp/iterator/distance“如果 InputIt 不是 LegacyRandomAccessIterator,如果 last 不能通过(可能重复)首先递增从第一个到达,则行为未定义。如果InputIt 是 LegacyRandomAccessIterator,如果 last 不能从 first 到达并且 first 不能从 last 到达,则行为未定义。"
-
所以这是XY problem。我会退后一步,重新关注最初的问题,而不是针对该问题提出的解决方案引起的问题。
-
@TedLyngmo 移动矢量。
标签: c++ vector iterator invalidation