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;
}
}
}
问题:http://codeforces.com/problemset/problem/4/C
我正在寻找一种方法,我可以将char数组作为地图元素来帮助解决方案, 然而, 当我将str [n] [40]声明为str,system as时,我最终搞砸了map.insert函数。 (有人可以解释为什么map.insert(str [i],1)在这种情况下不起作用吗?澄清这些概念会很好) 或者在这种情况下, 无法初始化char * str [40]数组。
我想知道这样做的合法方式是什么?
答案 0 :(得分: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 ++中,首先很少需要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 ++,但如何正确使用它们并不是很明显。
总之,你应该花更多的时间学习和学习如何使用各种容器。在这里,应使用std::vector
而不是new
和delete
。应使用std::string
代替char *
作为地图密钥。你会惊讶地发现最终结果会更小,更容易阅读和理解。