2016-12-22 14 views
-5

私はVS2015で以下のコードをコンパイルしようとしています。私のstd :: mapの最初のバージョンはコンパイルされていますが、秒版はコンパイルされません。std :: map find()エラーを返す

std::map<std::string, DataDictionary> _p1; 
DataDictionary DD = _p1.find["1"]; //ERROR 

I:私は、私は同じエラーを取得しています、私のstd ::マップを変更し、次を使用することを決定した場合であっても...私は私がここで間違ってやっているのか分から

std::map<int, std::string> _p; 
typedef std::pair<int, std::string> _q; 
_p.insert(_q(0, "Football0")); 
_p.insert(_q(1, "Football1")); 
std::string str = _p[1]; //OK...compiles and executes, no error, str = "Football1" as expected 

std::map<int, DataDictionary> _p1; 
typedef std::pair<int, DataDictionary> _q1; 

DataDictionary dd1; 
dd1.i = 0; 
dd1.version = "ver1"; 
_p1.insert(_q1(0, dd1)); 

DataDictionary dd2; 
dd2.i = 0; 
dd2.version = "ver2"; 
_p1.insert(_q1(1, dd2)); 

DataDictionary DD = _p1.find[1]; //error C3867: 'std::_Tree<std::_Tmap_traits<_Kty,_Ty,_Pr,_Alloc,false>>::find': non-standard syntax; use '&' to create a pointer to member 

を聞かせてください。 DataDictionary構造体でマップを使用しようとしていて、要素にアクセスするには_p1.find["1"]構文を使用してください。このアプローチはイテレータをマップに宣言するよりも高速であると仮定しているので、find()を使用してください。助けてください。おかげで、

+2

[ 'のstd ::マップ::見つける()'](http://en.cppreference.com/w/cpp/container/map/find)あなたはそれがないと思うタイプを返しません。 –

+2

あなたは角括弧を使用することができ、[*添字演算子*](http://en.cppreference.com/w/cpp/container/map/operator_at)、または[ 'find'](HTTP://en.cppreference .com/w/cpp/container/map/find)。これは通常の関数呼び出しであり、丸括弧を使用します。あなたは両方を混ぜています。 – BoBTFish

+0

ご返信ありがとうございます。しかし、注意してくださいコード - std :: string str = _p [1];実際に働いています。 std :: stringの代わりにstructを返そうとしているときだけ、コンパイルエラーが発生します – XMarshall

答えて

1

行う、とに_p1.find["1"]構文を使用することができます

std::map<std::string, DataDictionary>::iterator item = _p1.find("1"); 

またはC++ 11で

使用要素にアクセスする

いいえ、あなたは、メンバ関数に添字演算子を使用しようとしている。

find("1")が働くだろう。

find["1"]はコンパイルべきではありません。

_p1.find("1")、または_p1["1"]のいずれかを使用することを検討してください。その差は、マップ内の位置とブール・フラグ(マッピングされたシーケンスの終わりを超えてもよい)イテレータ、添字演算子(["1"])とその戻りを見つける 一対の参照のいずれかを返しています既存の要素を追加するか、要素が見つからない場合はその要素を追加し、その要素への参照を返します。

マップは、キーが含まれている場合は、チェック代わりにif(_p1.count("1"))を使用するには。

+0

私の間違いを指摘してくれてありがとう。答えとしてマーク.. – XMarshall

+0

@WhozCraig、ありがとう、私はそれを修正しました。 – utnapistim

0

私はそれが見つかったアイテムのイテレータを返すあなたは

_p1.find("1"); 

を意味だと思います。

あなたは、私がデータ辞書構造のマップを使用しようとしています

auto item = _p1.find("1"); 
+0

ありがとう、しかし、地獄はコードの最初のバージョンです - std :: string str = _p [1];は働いている。私が理解できない唯一のことは...マップ値としてstd :: stringの代わりに構造体を返そうとしているときにのみコンパイラエラーを受け取ります – XMarshall

+0

@XMarshallなぜですか?あなたがstd :: mapから値を取得した方法です。'_p [1]'はキー '1 'に関連付けられた値を返します。 –

+1

@XMarshall' _p [1] 'は[' std :: map :: operator [] ']を使用しています(http://en.cppreference .com/w/cpp/container/map/operator_at)、['std :: map :: find']とはまったく異なるもの(http://en.cppreference.com/w/cpp/container/map/find) 。 – WhozCraig

関連する問題