2011-09-13 5 views
0

강령 :중첩 된 boost :: unordered_map이 값을 업데이트하지 않습니까?

boost::unordered_map<int, boost::unordered_map<int, float>> map; 
{ 
    boost::unordered_map<int, float> h; 
    h.insert(make_pair(1, 0.5)); 
    map.insert(make_pair(5, h)); 
} 
{ 
    boost::unordered_map<int, float> h = map[5]; 
    h.insert(make_pair(2, 0.6)); 
    map.insert(make_pair(5, h)); 
} 
cout << map[5].size() << endl; 

왜 출력이 하나없는이 무엇입니까? 그리고 boost :: unordered_map *>을 사용하면 모든 것이 잘 작동합니다. 아무도 도와 줄 수 있습니까?

답변

0

여기에 코드의 두 번째 블록에서 일어나는 내용은 다음과 같습니다

  1. h = map[5]은 내부지도의 복사 만듭니다.
  2. h.insert(...)은 내부 맵의 복사본에 값을 추가합니다.
  3. map.insert(...) 아무 것도하지 않습니다. unordered_map::insert inserts an element to the map if and only if there is no element in the map with an equivalent key. 그러나 키 5가 이미 있으므로 삽입이 발생하지 않습니다. 삽입 호출의 반환 값 부울 부분이 이면인지 확인하여이를 확인할 수 있습니다.

블록의 끝에서 복사 된 맵은 무시되고 단일 값을 가진 원래 내부 맵은 map에 남아 있습니다. 결과적으로 map [5] .size() == 1의 출력을 얻게됩니다.

하지만 내부 맵의 값 유형이 포인터 boost::unordered_map<int, float>*으로 설정되면 2의 출력을 얻는 이유는 무엇입니까? 코드의 두 번째 블록은이 작업을 수행 할 것입니다 :

  1. h = map[5]map에 삽입 된 내부 맵에 대한 포인터를 얻을 것이다.
  2. h.insert(...)은 복사본이 아닌 내부 맵에 직접 값을 추가합니다. 이 시점에서 map [5] .size() == 2 이미.
  3. map.insert(...)은 아무 것도 수행하지 않습니다. 하지만 내부지도가 이미 수정되었습니다.
+0

정확히 올바른 답변입니다. 그리고지도를 사용하는 것과 동일한 작업을 쉽게 수행 할 수 있습니다. 간단한 테스트에서는 효율성이 같습니다. 차이점은 무엇입니까? 그 열쇠가 존재한다면 마지막 두 사람은 아무 것도하지 않을 것이라는 것을 압니다. 그리고 더 많은 차이점이 있습니까? – lhdgriver

관련 문제