2016-05-19 6 views
1
int main(){ 
int n; 
cin>>n; 
char *str[40]; 
str=new char [10000][40]; //I don't know how to initialize this array 
std::map<char*,int> system; 
int i,j; 
//solving Question 4C @ Codeforces 
for(i=0;i<n;i++){ 
    cin>>str[i]; 
} 
for(i=0;i<n;i++){ 
    int count=0; 
    for(std::map<char*,int>::iterator iter=system.begin();iter!=system.end();iter++){ 
     if(strcmp(iter->first,str[i])==0){ 
      count=++iter->second; 
     } 
     else if(strcmp(str[i],iter->first)>0){ 
      break; 
     } 
    } 
    if(count==0){ 
     system[str[i]]=1; 
     cout<<"OK"<<endl; 
    } 
    else{ 
     char *strint; 
     strint=new char[5]; 
     strint=convert(count); 
     strcat(str[i],strint); 
     cout<<str[i]<<endl; 
    } 
} 

}char * []配列を初期化するには?

質問:http://codeforces.com/problemset/problem/4/C

は私がシナリオを解決する手助けするためにマップの要素としてchar配列を置くことができる方法を探しています、 しかし、 私がなってしまいましたstr [n] [40]をstr、systemとして、 と宣言すると、map.insert(str [i]、1)がこの場合に動作しない理由を説明できますか?概念を明確にするのは甘いでしょう) またはこの場合、 はchar * str [40] arを初期化できませんレイ。

これを行う正当な方法は何ですか?

+4

だから 'std :: string'が好きではない;-)?あなたは現在、大さじのようなリークをコードしています。 – Bathsheba

+2

'std :: vector v(40)'を使わないのはなぜですか? –

+0

'std :: map'のキーとしてポインタを使うのは、通常あなたがしたいことではありません。なぜ 'std :: vector'と' std :: string'を使わないのですか? 1969年のようにプログラムする必要はもうありません。 – molbdnilo

答えて

3
char *str[40]; 
str=new char [10000][40]; //I don't know how to initialize this array 

strは配列である。配列内の値に何かを割り当てることはできますが、配列自体は割り当てることができません。あなたはおそらく、やろうとしている。

char *str[40]; 

for (size_t i=0; i<40; ++i) 
    str[i]=new char [10000]; 

をそれでも、現代のC++に1はほとんどnewと最初の場所でdeleteを行う必要がありません。代わりに現代のC++コードはコンテナを使用します。コンテナといえば:

std::map<char*,int> system; 

これは良いものにつながるわけではありません。 std::mapは文字通りその値でキーを比較します。だから、:

char *foo1=new char[40]; 

strcpy(foo1, "foo"); 

system[foo1]=0; 

char *foo2=new char[40]; 

strcpy(foo2, "foo"); 

auto iter=system.find(foo2); 

あなたはここでfind()、この要素を見つけるだろうと思いますか?もちろん、それは異なるポインタ値であるためです。

生ポインタをキーとして使用するマップは有効なC++ですが、正しく使用する方法はあまり明白ではありません。

結論として、さまざまなコンテナの使用方法の学習や学習にもっと時間を費やす必要があります。ここでは、newdeleteでフュージングする代わりにstd::vectorを使用する必要があります。マップキーとしてchar *の代わりにstd::stringを使用する必要があります。あなたは最終結果がより小さくて読みやすく、理解することを学ぶことに驚くでしょう。

+0

返事をありがとう、私はさらに文字列のコンテナを見ていきます。 – haleyk