如何初始化char * []数组?

时间:2016-05-19 10:59:19

标签: c++ arrays

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]数组。

我想知道这样做的合法方式是什么?

1 个答案:

答案 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 ++中,首先很少需要newdelete;相反,现代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而不是newdelete。应使用std::string代替char *作为地图密钥。你会惊讶地发现最终结果会更小,更容易阅读和理解。