2017-01-16 6 views
1

私は、比較する地図を作成して、単語のすべての文字が一意であるかどうかを確認しています。このマップを作成すると、対応する文字に1の値が格納されます。問題は、私が文字キーからマップの値を出力するとき、私はすべての値に対して0を受け取るだけです。マップ内のデフォルトの整数値を変更するにはどうすればよいですか?

これを調べようとしている間、誰かが地図のすべての値がゼロにデフォルト設定されていると私に言いましたが、私の整数は変更するために初期化する必要があります。リテラルの整数値を渡すことができるはずなので、整数で初期化する必要があることを完全にはっきりさせることはできません。

あなたは、私はキャラクターがすでにマップ内に存在するかどうかを確認するために単語の文字と私のコードのチェックのために1に渡すようにしようとしています表示されますよう、次は、私が現在持っているコードです:

#include <iostream> 
    #include <map> 
    using namespace std; 
    bool unique(char const* word) 
     { 
     map<char,int> cmpr; 

     for(int i =0; word[i]!='\0';i++) 
     { 
     if(cmpr[word[i]]) 
     { 
      cout<<"Not all unique"; 
      return false; 
     } 
    else 
     { 
      cmpr.insert(pair<char,int>(word[i],1)); 
     } 
      cout<<cmpr[char(word[i])]; 
    } 
    for(map<char,int>::iterator it = cmpr.begin(); it != cmpr.end();it++) 
    { 

     cout<<it->first<<" and "<<it->second<<endl; 


    } 
    return true; 
} 
int main() 

{ 
    unique("hello"); 
} 

そして、私の出力結果(マップノードの第1および第2の値を印刷しようとした場合):

e and 0 
    h and 0 
    l and 0 
    o and 0 
+1

文字配列ポインタではなく 'std :: string'を使用することを推奨します。文字配列の一般的な問題の1つは、ターゲット文字列ではなく、順序付けのためのポインタを比較することです。 –

+0

'map'を検索するときは' [] 'よりも 'find'を使います。 'find'は新しいキーを挿入しません。 –

答えて

2

ここでの問題は、その

です

マップに存在しない要素が存在しない場合は、マップに要素を挿入します。これは、キーword[i]がすでに存在するため

cmpr.insert(pair<char,int>(word[i],1)); 

は何もしない操作であることを意味します。あなたは何ができるか

find以来

if(cmpr.find(word[i]) != cmpr.end()) 

にcondtionに変更される要素を挿入したり、それが動作するように取得するには

cmpr[word[i]] = 1; 

cmpr.insert(pair<char,int>(word[i],1)); 

を変更しません


これは本当に必要なものではありませんが、ご注意ください。あなたは、あなたが全体の機能が

bool unique(const std::string& word) 
{ 
    return std::set(word.begin(), word.end()).size() == word.size(); 
} 

のように書くことができstd::stingstd::setを使用する場合はどのようなことがないのは、stringからsetを構築し、setは同じ力学が、それが唯一のユニークなキーを可能にした持っています。つまり、サイズが同じでない場合は、そこに少なくとも1つの繰り返し文字があります。

+0

また、要素を挿入せずに要素が存在するかどうかを調べる条件を修正してください( 'map :: find()'メンバ関数) –

+0

@BenVoigt良い点。更新しました。 – NathanOliver

+0

@BenVoigt Wow。私はそれを忘れたとは信じられません。再度、感謝します。 – NathanOliver

0

あなたは増加して、デフォルト値を使用することができます。

if (cmpr[word[i]]++ != 0) 
    // value was already present 

これはデータがありますが、各文字の出現回数を取得することができます追加ボーナス(あなたがそれを見てどのように応じて)をした後、追加されました。

関連する問題