迭代器放入要移动的容器中

小狗

我有一个在其中保存一个容器的类,并在该容器中进行了迭代。如何正确实现move构造函数?我似乎还记得,按照标准,您不能依靠迭代器在移动后仍然有效(这很愚蠢)。有没有什么方法可以使迭代器“更新”(如果无效)或其他原因?还是我必须动态分配容器,移动它,然后使迭代器保持这种方式有效?

丹尼尔·弗雷(Daniel Frey)

更新:将astd::unique_ptr用作容器的持有人是规范的通用解决方案-只需不移动容器,仅转移所有权并交换迭代器即可。正如您已经说过的,您可以将这种情况作为优化进行特殊处理,尽管我希望通用解决方案也非常有效,并且在证明它是真正的解决方案之后,我只会接受代码的更多复杂性(即潜在的错误)用例的性能优势。

我会将下面的前一个答案留给以后的读者使用:阅读它和评论,以了解为什么其他解决方案不能真正起作用,在什么情况下会引起麻烦。


更新迭代器的明显方法是:

Container c = ...;
Container::iterator it = ...;

const auto d = std::distance( c.begin(), it );
Container n = std::move(c);
it = n.begin();
std::advance( it, d );

通常是线性的,但是当迭代器是随机访问迭代器时是恒定的。

由于您可能不想这样做,因此有两个选项应该会有所帮助:默认情况下构造新容器并在swap不使迭代器无效的情况下使用它,或者将容器放入astd::unique_ptr并将其移动。

第一种方法(swap)要求两个实例都具有容器实例,这可能比存储在中的简单单个指针要大一些std::unique_ptr当您经常移动实例时,std::unique_ptr基于-的方法对我来说似乎更可取,尽管每次访问都需要一个以上的指针间接方式。自己判断(并衡量)最适合您的情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章