2009-04-06 5 views
1

기본적으로 내가 가지고,집합으로 값을 포함하는지도 사용

typedef map<std::string, set<double> > MAP_STRING_TO_SET; 

집합을 복사하지 않고 새 값으로 집합을 업데이트 (값 추가 또는 제거)하는 가장 좋은 방법은 무엇입니까?

내가 볼 수있는 유일한 실행 가능한 솔루션은 map<std::string, set<double>* >를 사용하는 것입니다.

감사

+0

당신이 그들이 복사되는 생각하는 이유는 무엇입니까? –

답변

12

집합은 초기화시에만 복사됩니다. 당신은지도 :: 연산자 []가 참조를 반환 이후

myMap[myString].insert(myDouble); 

처럼 뭔가를 할 수 있습니다.

+0

정말입니까? myMap [myString]은 세트의 임시 복사본을 만들지 않으니까 실제로지도의 세트를 업데이트하지 않겠습니까? –

+0

아니요, 참조를 만듭니다. 임시 사본이 아닙니다. 그렇지 않으면지도가별로 쓸모 없게 될 것입니다. – rlbond

-1

저는 스왑을 사용할 수 있습니다 - 예.

my_map["123"].swap(my_set) 

당신에게 중요하지 않습니다 my_set을 건드리지 제공. 그러면 my_map["123"]의 이전 내용이 my_set으로 바뀌고 빠릅니다.

인덱싱 연산자 []는 포함 된 set에 대한 참조를 반환하므로 다른 변수와 마찬가지로 조작 할 수 있습니다. 개별 값을 추가/삭제하려면 또는 erase() 메서드를 사용할 수 있습니다. my_map["123"].insert(123).

지도에 새 세트를 지정할 때 복사가 실제로 수행됩니다 (예 :

my_map["123"]=my_set 

my_set 사본을 생성합니다. 나중에 my_set 값을 사용할 필요가없는 경우 swap() 메서드를 사용하면 두 세트의 포인터를 뒤섞을 수 있습니다. 그러나 my_set은 이전 my_map["123"]의 내용을 갖습니다.

+0

정교하게하십시오 ... –

-1

또한이 작업을 수행 할 수 있습니다

map<std::string, set<double> >::iterator iter = myMap.find(myString); 
if(iter != myMap.end()) 
{ 
iter->second.insert(myDouble); 
} 
관련 문제