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 数组作为 map 的一个元素来帮助解决这个场景, 然而, 当我将 str[n][40] 声明为 str、系统为 时,我最终搞砸了 map.insert 函数, (有人可以解释为什么 map.insert(str[i],1) 在这种情况下不起作用吗?澄清这些概念会很好) 或者在这种情况下, 未能初始化 char*str[40] 数组。
我想知道这样做的合法方法是什么?
最佳答案
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 *
作为映射键。您会惊讶地发现最终结果会更小且更易于阅读和理解。
关于c++ - 如何初始化 char*[] 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37321218/