2014-06-18 44 views
1
#include <stdio.h> 
#include <iostream> 
#include <map> 
#include <string> 
#include <stdlib.h> 

using namespace std; 

class Fix 
{ 

}; 

int main() 
{ 
    map<int, Fix *> m; 

    Fix * f = new Fix(); 
    m.insert(make_pair(2, f)); 

    m.insert(make_pair(3, f)); 

    map<int, Fix *>::iterator it = m.find(2); 
    map<int, Fix *>::iterator it1 = m.find(2); 


    m.erase(it); 

    // Will Create problem 
    // m.erase(it1); 

    // Still value is there 
    // So from the map node, iterator copy its value ? 
    printf("%d\n", it->first); 
    printf("%d\n", it1->first); 

} 

我有一個Map包含兩個條目,也是兩個迭代器指向相同的條目。 使用Iterator1擦除地圖中的一個條目。刪除後仍然Iterator1和Iterator2保持值。std :: map多個迭代器,刪除和它的值

問題

  1. 是迭代器指向地圖(紅黑樹)的節點
  2. 是迭代器應對無論是從節點鍵和價值,同時它迭代?因此,即使在從地圖中刪除條目後,它也會保留該值。

回答

3

對於使用上迭代this methodstd::map::erase具有以下效果:

  • 除去從容器

  • 引用和迭代器擦除元件被無效指定的元素。其他引用和迭代器不受影響。

所以你不能使用你it1擦除it後,即使it1仍然可以通過巧合指向「現在是無效的」以前的記憶。

0

請標記接受的答案。

bits_international在他的解釋中是正確的,將主函數中的代碼更改爲以下內容。

map<int, Fix *> m; 

Fix * f = new Fix(); 
m.insert(make_pair(2, f)); 

m.insert(make_pair(3, f)); 

map<int, Fix *>::iterator it = m.find(2); 

it = m.erase(it); //you can reuse it after this call 
map<int, Fix *>::iterator it1 = m.find(2); 

it1 = m.erase(it1); //you can reuse it1 after this call 

printf("%d\n", it->first); 
printf("%d\n", it1->first);