2010-02-22 1 views
12

다음과 같은지도 구조가 있습니다 : map < pair < int,int >, object* > 그리고 그것에 삽입하고 싶습니다.지도에 쌍을 삽입하는 방법

내가 한 쌍과 오브젝트를 삽입하려고 내가 이 중 한 쌍의을해야하기 때문에 그것을 할 것입니다 어떻게?

내가 가진 make_pair() 쌍과 개체 중 하나를 사용하여 새 쌍을 만들어야합니까? 그렇다면이 작업을 수행하는 방법을 알려주십시오.

+5

어떤 코드를 사용해 보셨습니까? – Mark

답변

20
object * myObject = // get an object somehow 
myMap.insert(std::make_pair(std::make_pair(1,2), myObject)); 

또는

typedef map<pair<int, int>, object *> MapType; 
object * myObject = // get an object somehow 
myMap.insert(MapType::value_type(std::make_pair(1,2), myObject)); 
+0

첫 제안을 사용했습니다. 간결하고 간결합니다. 정말 고마워! – Myx

+2

코드에서이 부분을 많이 사용하는 경우에는 읽기 쉽도록 삽입 (쌍, 객체) 함수가있는 클래스에서지도를 래핑하고 싶을 수 있습니다. –

1

두 가지 방법이 있습니다 :

키가 존재하지 않는 경우에
typedef std::map<int,Object> map_t; 
map_t map; 
Object obj; 

std::pair<map_t::iterator, bool> result = map.insert(std::make_pair(1,obj)); // 1 

map[1] = obj; // 2 
  1. 만 작동 키 값 쌍의 반복자 포인트 bool은 삽입 여부를 나타냅니다. 이미 객체를 존재하지 않는 경우

  2. 쉽게하지만, 첫째 기본 구성하고 대신 인의 할당 방금 여부에 의해 선택, 성능에 대해 걱정할 필요가없는 경우 사본

을 구성되어 또는 이전 항목을 지우고 싶지 않습니다. 당신을 가정

+0

맞지만 질문은 쌍이기도 한 키 유형이있는지도에 대해 질문했습니다. –

+0

나는 그 의존을 보지 못한다. 'sed/1/std :: make_pair (1,1)/g'과 적절하게 정의 된'map_t'를 사용합니다. 그것은 코멘트 나 다른 것을 바꾸지는 않습니다. 단지 사람들을 숨기는 것보다 중요한 포인트에 초점을 맞추기 위해 간단한 개념으로 시연하는 것을 선호합니다. –

10

나중에 C++ 11 이상을 사용하는 가장 좋은 방법은 아마도 :

object * myObject = // get an object somehow 
myMap.emplace({1,2}, myObject); 

, emplace은 별도의 같은 키와 값을 취 insert의 버전으로 간주 할 수 있습니다 인수 (해당 pair 유형의 생성자가 취할 수있는 인수의 조합을 실제로 취할 수 있음). 문법적으로 더 깨끗한 것 외에도 make_pair은 대개 컨테이너의 value_type과 정확하게 일치하지 않는 유형의 출력을 생성하므로 불필요한 유형 변환이 발생하기 때문에 make_pair보다 더 효율적입니다.

은 또한 단지 나중에 C++ 11에서 작동하는이, 추천 사용 :

object * myObject = // get an object somehow 
myMap.insert({{1,2}, myObject}); 

이것은 emplace의 약간 의외 사용을 피할 수를하지만, 이전에 키 또는 값 경우 작동하지 않았다 유형은 이동 전용입니다 (예 : unique_ptr). 표준에서 수정되었지만 표준 라이브러리 구현이 아직 수정 사항을 선택하지 않았을 수 있습니다. 이것은 이론적으로는 다소 효율적이지는 않지만 중간 정도의 괜찮은 컴파일러가 쉽게 최적화 할 수있는 방식으로 진행될 수 있습니다.

+0

공식 답변은 컴파일러 버전 기준에 따라 병합되어야한다고 생각합니다. – Aviv