Pup*_*ppy 6 c++ iterator c++11
我有一个类,其中包含一个容器,以及一个容器中的迭代器.如何正确实现移动构造函数?我似乎记得,通过标准,你不能依赖于移动后剩余有效的迭代器(这是如此愚蠢).是否有一些方法可以"更新"迭代器,如果它是无效的或什么?或者我是否必须动态分配容器,移动它,然后使迭代器保持有效?
更新:使用 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 );
Run Code Online (Sandbox Code Playgroud)
它通常是线性的,但当迭代器是随机访问迭代器时是恒定的。
由于您可能不想这样做,因此有两个选项应该有所帮助:要么默认构造新容器并使用swap而不使迭代器无效,要么将容器放入 a 中std::unique_ptr并移动它。
第一种方法 ( swap) 要求两个实例都具有容器实例,这可能比存储在std::unique_ptr. 当您经常移动实例时,std::unique_ptr基于 - 的方法对我来说似乎更可取,尽管每次访问都需要一个指针间接访问。自己判断(并衡量)什么最适合您的情况。