2017-11-17 14 views
0

私はPythonの辞書機能に精通しています。私の研究に基づいて、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

あなたが修正する必要がある唯一の事は、間接参照を置くことです:

return *mapK.find(inquiry); 

あるいは、より良い、ちょうどoperator[]を使用します。

return mapK[inquiry]; 

ことがinquiryがマップにない場合のにメモしています空の文字列を返します。見つけた場合、それはまっすぐな未定義の振る舞いです。

+0

奇妙なことに、私はmapk [inquiry]を先に使ったと思っていましたが、今は動作しませんでした。おそらくタイプミス。逆参照についての説明をありがとう。 – Owen

+0

@Owen、注意してください。正しい要素がない場合は、UBである終了イテレータを逆参照しようとします。私は小切手を入れてデフォルト値を返すことをお勧めします。 – Incomputable

0

問題の戻り値はfindです。マップされた型は返されません。むしろイテレータを返します。

findのシグネチャは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[]を使用することができますような何かを書くことができますが、キーが見つからない場合は、このマップでは、デフォルト構築要素を挿入します。

関連する問題