我有一个类是一个容器的委托并在内部存储一个迭代器到这个容器。从原始容器镜像迭代器到它的副本
class A {
public:
list<int> m_data;
list<int>::iterator m_relevantDataStart;
A(const A & cpy) {
m_data = cpy.m_data;
m_relevantDataStart = cpy.m_relevantDataStart; //<--- UNWISE
}
};
现在的问题是,如果我尝试写一个简单的构造函数如上所描绘复制两个容器和迭代器,迭代器成为副本的情况下无法使用,更具体地讲,我以后再遇到一个运行时异常试图进行比较时:
`if(m_relevantDataStart == m_data.begin())` - Expression: list iterators incompatible
这我相信的出现是由于m_relevantDataStart
仍然是我复制的,而m_data.begin()
指向原始容器的副本之类的m_data
迭代器。
我发现this answer,这似乎有一些相关性,这意味着指向原始容器的iterator
确实无法使用。
我的问题和TL; DR:有没有一种方法可以将迭代器镜像到原始容器,以便此“镜像”的结果将指向复制容器中的对应元素?
我能想到的一个解决方案,就需要在原来的容器确定项目指标和推进在副本容器中的迭代器(线性与std::list
打交道时的复杂性),但除非我用一些随机存取容器,而不是std::list
它似乎相当低效。
也总是有选择写一个自定义容器复制算法,我真的很想避免。
谢谢你的回答。在我的情况中,'list'是最合适的容器,因为两端的插入和删除非常频繁。 “距离”和“高级”解决方案是我计划采用的解决方案。我希望可能会有一些'list'函数的隐藏过载,它会为我做很脏的工作(可能在复制时),但是您向我保证没有真正优雅的解决方案。 – user35443
@ user35443:如果你需要在两端插入/删除(但不在中间),你可能需要'std :: deque'而不是'std :: list'。它在两端提供了不断复杂的插入/删除操作,*和*随机访问迭代器。 –
对不起,我的意思是(插入)和(清除两端):) – user35443