2017-11-17 12 views
0

저는 파이썬의 사전 함수에 익숙하며, C++의지도 함수가 비교적 유사하다는 연구 결과를 기반으로한다고 가정합니다. 그러나 나는 "변환"문제로 실행 해요 :C++의지도 및 문자열 변환 오류

std::string dictionary(std::string inquiry){ 
    std::map<std::string, std::string> mapK; 
     mapK["12th st. Oakland City Center"]="12th"; 
     mapK["16th st. Mission"]="16th"; 

    return mapK.find(inquiry); 
} 

이 문자열 다시 주에 해당하는 키 반환에 다음 문자열을 수신해야하는 문자열 함수입니다. 분명히 return 문에 문제가 있습니다.

error: could not convert 'mapK.std::map<_Key, _Tp, _Compare, _Alloc>::find<std::basic_string<char>, std::basic_string<char>, std::less<std::basic_string<char> >, std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > > >((*(const key_type*)(& inquiry)))' from 'std::map<std::basic_string<char>, std::basic_string<char> >::iterator {aka std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, std::basic_string<char> > >}' to 'std::string {aka std::basic_string<char>}' 
    return mapK.find(inquiry); 
+0

'std :: basic_string' 대신에'std :: string'을 사용해야합니다. –

+0

지도를 작성해야합니다. 바로 잡으십시오. – Owen

답변

0

std::map::find() 반환, 특히 std::map::iterator 반복자. 그 inquiry 경우지도에없는 불구하고

return mapK[inquiry]; 

메모를 수행합니다 단지 operator[] 사용,

return *mapK.find(inquiry); 

또는 더 나은 :

당신이 해결해야 할 유일한 것은 역 참조를 넣어하는 것입니다 빈 문자열을 반환합니다. find의 경우에는 정의되지 않은 동작입니다.

+0

이상하게 생각합니다. 이전에 mapk [inquiry]를 사용했는데 작동하지 않았지만 지금은 작동한다고 생각했습니다. 아마도 오타 일 것입니다. 참조 취소에 대한 설명 주셔서 감사합니다. – Owen

+0

@Owen,주의하십시오. 올바른 요소가 아니라면 UB 인 최종 반복자를 역 참조하려고 시도 할 것입니다. 수표를 넣은 다음 기본값을 반환하는 것이 좋습니다. – Incomputable

0

반환 유형이 find 인 문제가 있습니다. 매핑 된 유형을 반환하지 않습니다. 오히려 iterator를 반환합니다.

찾을 서명은 iterator find(const Key& key);입니다 (here 참조, const 과부하도 있음).

또한 키가 발견되었는지 확인해야합니다. 그래서 당신은

MapType::iterator i = mapK.find(inquiry); 
if (i != mapK.end()) 
    return i->second; 
else 
    return ""; // or handle error some other way 

는 다른 방법이 멤버 액세스 operator[]를 사용할 수 같은 것을 쓸 수 있지만, 키가 발견되지 않는 경우,이지도의 기본 구성 요소를 삽입합니다.