我考慮去除的二叉搜索樹的實現。我知道std :: map和std :: set通常是作爲一個RBTree實現的。但無論如何,如果它是一些BST,那麼當擦除/移除具有2個孩子的節點時,我們通常將其與其後繼者(或前驅者)交換。許多教科書顯示這只是複製繼任者的關鍵和價值。但是這個副本不透明。例如,如果值是另一個容器,我有未完成的迭代器,然後刪除一些OTHER鍵,現在可以使迭代器無效,我必須對我沒有明確更改的容器進行迭代。我們可以將後繼節點重新鏈接到應該刪除節點的樹中,而不是複製鍵值。這將維護節點的狀態。請問C++的std ::地圖和std ::設置擦除複製值,從而迭代器失效
假設我有地圖矢量的:
std::map<int, vector<int> > mymap;
// Add root
mymap.insert(make_pair(2, vector<int>()));
// Add left child
mymap.insert(make_pair(1, vector<int>()));
// Add right child
mymap.insert(make_pair(3, vector<int>()));
mymap[3].push_back(10);
// I get an iterator to the vector stored in the node with key=3
vector<int>::iterator it = mymap[3].begin();
// I now remove element 2 from the map.
mymap.erase(2);
// If the successor's (i.e. 3's) key,value were *copied* to 2's node
// and then 3's node was deleted this would invalid iterators
vector<int>::iterator it2 = mymap[3].begin();
// These could/should be different if remove copied the successor
cout << &*it << " " << &*it2 << endl;
當然包含到位2的節點和2的節點中刪除的3可能只是「重新連接」樹內的節點。這將保持關鍵值的正確狀態。
我編寫了這個測試的情況下,它似乎重新鏈接,而不是複製。這種行爲是在哪裏定義的?同樣,如果我有一個矢量向量(即vector>,並且我在其中一個「內部」向量中持有一個迭代器,但由於插入另一個向量而導致外部向量調整大小,那麼我的迭代器甚至是無效的雖然我沒有在技術上修改那個內部向量,那麼無效化的「傳遞性」屬性在某處是拼寫出來還是「顯而易見」/「隱含」,而我只是對遊戲速度很慢?