0

できます:

map<char*, int> counter;
++counter["apple"];

しかし、私がするとき:

--counter["apple"] // when counter["apple"] ==2;

VS 2008 でデバッガーがハングアップしました。

ヒントはありますか?

4

3 に答える 3

5

その価値に頼っていますか?文字列リテラルは、異なる用途で同じアドレスを持つ必要はありません (特に、異なる翻訳単位で使用される場合)。したがって、実際には次のように 2 つの値を作成できます。

counter["apple"] = 1;
counter["apple"] = 1;

また、アドレスでソートされるため、ソートは行われません。コンテンツを認識しており、辞書式に比較std::stringしているため、その問題がないものを使用します。operator<

map<std::string, int> counter;
counter["apple"] = 1;
assert(++counter["apple"] == 2);
于 2009-05-20T08:08:18.443 に答える
2

次の形式のマップ:

map <char *, int> counter;

含まれている char ポインターを効果的に管理できないため、あまり賢明な構造ではありません。マップを次のように変更します。

map <string, int> counter;

問題が解決するかどうかを確認します。

于 2009-05-20T08:09:57.037 に答える
0

問題が見つかりました。それを次のように変更すると:

map<string,int> counter;
counter["apple"]++;

if(counter["apple"]==1)
   counter.erase("apple");
else 
   counter["apple"]--; //this will work

キー/値のペアで、値が int で値 ==1 の場合、どうにかして map[key] を実行できませんでした--, ('だって、値が ==0 になるから?)

于 2009-05-20T19:54:22.153 に答える