다음과 같은지도 구조가 있습니다 : map < pair < int,int >, object* >
그리고 그것에 삽입하고 싶습니다.지도에 쌍을 삽입하는 방법
내가 한 쌍과 오브젝트를 삽입하려고 내가 이 중 한 쌍의을해야하기 때문에 그것을 할 것입니다 어떻게?
내가 가진 make_pair()
쌍과 개체 중 하나를 사용하여 새 쌍을 만들어야합니까? 그렇다면이 작업을 수행하는 방법을 알려주십시오.
다음과 같은지도 구조가 있습니다 : map < pair < int,int >, object* >
그리고 그것에 삽입하고 싶습니다.지도에 쌍을 삽입하는 방법
내가 한 쌍과 오브젝트를 삽입하려고 내가 이 중 한 쌍의을해야하기 때문에 그것을 할 것입니다 어떻게?
내가 가진 make_pair()
쌍과 개체 중 하나를 사용하여 새 쌍을 만들어야합니까? 그렇다면이 작업을 수행하는 방법을 알려주십시오.
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));
첫 제안을 사용했습니다. 간결하고 간결합니다. 정말 고마워! – Myx
코드에서이 부분을 많이 사용하는 경우에는 읽기 쉽도록 삽입 (쌍, 객체) 함수가있는 클래스에서지도를 래핑하고 싶을 수 있습니다. –
두 가지 방법이 있습니다 :
키가 존재하지 않는 경우에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
만 작동 키 값 쌍의 반복자 포인트 bool은 삽입 여부를 나타냅니다. 이미 객체를 존재하지 않는 경우
쉽게하지만, 첫째 기본 구성하고 대신 인의 할당 방금 여부에 의해 선택, 성능에 대해 걱정할 필요가없는 경우 사본
을 구성되어 또는 이전 항목을 지우고 싶지 않습니다. 당신을 가정
맞지만 질문은 쌍이기도 한 키 유형이있는지도에 대해 질문했습니다. –
나는 그 의존을 보지 못한다. 'sed/1/std :: make_pair (1,1)/g'과 적절하게 정의 된'map_t'를 사용합니다. 그것은 코멘트 나 다른 것을 바꾸지는 않습니다. 단지 사람들을 숨기는 것보다 중요한 포인트에 초점을 맞추기 위해 간단한 개념으로 시연하는 것을 선호합니다. –
나중에 C++ 11 이상을 사용하는 가장 좋은 방법은 아마도 :
맵object * myObject = // get an object somehow
myMap.emplace({1,2}, myObject);
, emplace
은 별도의 같은 키와 값을 취 insert
의 버전으로 간주 할 수 있습니다 인수 (해당 pair
유형의 생성자가 취할 수있는 인수의 조합을 실제로 취할 수 있음). 문법적으로 더 깨끗한 것 외에도 make_pair
은 대개 컨테이너의 value_type
과 정확하게 일치하지 않는 유형의 출력을 생성하므로 불필요한 유형 변환이 발생하기 때문에 make_pair
보다 더 효율적입니다.
object * myObject = // get an object somehow
myMap.insert({{1,2}, myObject});
이것은 emplace
의 약간 의외 사용을 피할 수를하지만, 이전에 키 또는 값 경우 작동하지 않았다 유형은 이동 전용입니다 (예 : unique_ptr
). 표준에서 수정되었지만 표준 라이브러리 구현이 아직 수정 사항을 선택하지 않았을 수 있습니다. 이것은 이론적으로는 다소 효율적이지는 않지만 중간 정도의 괜찮은 컴파일러가 쉽게 최적화 할 수있는 방식으로 진행될 수 있습니다.
공식 답변은 컴파일러 버전 기준에 따라 병합되어야한다고 생각합니다. – Aviv
어떤 코드를 사용해 보셨습니까? – Mark