我有一個類是一個容器的委託並在內部存儲一個迭代器到這個容器。從原始容器鏡像迭代器到它的副本
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