2013-11-24 1 views
0

내가 가진 같은 C++ 코드 : rtstructure 키에 대한 표준 : : 문자열을 표준 : :지도가키가없는 경우 충돌없이 std :: map에서 값을 가져올 수 있습니까?

if(rtstructure.find(varName) != rtstructure.end()) { 
    rtdef = rtstructure[varName]; 
} 

. 이 코드는 작동하지만 동일한 키에 대해 두 번 검색하는 것이 낭비처럼 보입니다. 할당 주위에 if case를 생략하면 varName이 존재하지 않는 키를 가리키면 프로그램이 충돌합니다.

하나의지도 연산에서 std :: map의 키를 찾아서 존재할 경우 해당 값을 얻을 수 있습니까? 존재하지 않으면 충돌하지 않습니다.

+1

프로그램이 일반적으로 중단되면 안됩니다. 'map '를 사용하고 계십니까? 또한'map :: find'가 반복자를 반환한다는 점에 유의하십시오. 반복자 ('second')의'value' 개념을 행복하게 사용할 수 있습니다. – Zeta

+0

예 map is std :: map rtstructure; 여기서 rtobject_t는 구조체입니다. –

+0

분명히 [] 연산자는 존재하지 않는 멤버를 참조하면 초기화되지 않은 포인터를 반환합니다. –

답변

5

find은 을 가리키는 std::map<>::iterator입니다. 이터레이터는 저장하고 다시 사용할 수 있습니다 (예 : erase과 같은 무효화 작업을하지 않은 경우).

// i don't know the type of rtstructure so i use auto 
// you can replace it to the correct type if C++11 is not available 
auto it = rtstructure.find(varName); 
if(it != rtstructure.end()) { 
    rtdef = it->second; 
} 
관련 문제