2017-10-05 10 views
2

文字列とそれが文字列で繰り返される回数をチェックする関数があります。イテレータを使用してマップの2番目の値を更新する方法

それは=> 1 [H]の文字列が "こんにちは" である(例えば)として格納されている[E] => 1 [L] => 2 [O] =

文字がより発生するたびに1一度それを更新する必要があります。

私は

it->second = it->second+1; 

を使用してみました。しかし、それは 私はそれをどのように行うことができます動作しますしないのですか?

完全なコードでは、あなたはすべてのそのコードを必要としない

int fn(string a) { 
    map<char,int> mymap; 
    for(int i=0;i<a.size();i++) 
    { 
     std::map<char, int>::iterator it = mymap.find(i); 
     if(it!=mymap.end()) 
     { 
      //say i need to update occurrence from 1 to 2 or 2 to 3... 
      it->second = it->second+1;//(how can i do that) 
     } 
     else 
     mymap.insert(pair<char,int>(a[i],1)); 
    } 
    std::map<char,int>::iterator i; 
    for(i=mymap.begin();i!=mymap.end();i++) 
    { 
     cout<<i->first<<i->second; 
    } 
} 
+1

エラーを再現できません。あなたが提供したサンプルをコンパイルしようとするとうまく動作します。 –

+2

@juanchopanzaは洗練されたソリューションを提供します。あなたの解決策の問題は、単にタイプミスです: 'mymap.find(i)' - > 'mymap.find(a [i])' –

+0

[再現できません](https://ideone.com/TeHBNT ) –

答えて

11

です。あなただけの1が与えられたキーのために存在しない場合、マップのoperator[]がゼロに初期化要素を挿入するため

for (auto c : a) mymap[c]++; 

これが機能すると言うことができます。

+0

の範囲を追加したときに私はちょうどコメントしようとしていました。それに対して+1。 – NathanOliver

+0

しかし、私は特定の文字mymap.find(i)を見つける必要があります。もしそれが起こると私はインクリメントする必要があります – Muthu

+2

@Muthu 'a [i]'要素が見つからなければ、それは0に初期化されるので、ループ本体はそれを1に増やします。これはあなたの 'else'体。 –

関連する問題