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

标签 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 数组作为 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++ 中,很少需要首先执行 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 * 作为映射键。您会惊讶地发现最终结果会更小且更易于阅读和理解。

关于c++ - 如何初始化 char*[] 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37321218/

相关文章:

php - Laravel - 在 Controller 中存储和设置数组

Ruby:从哈希 A 到哈希 B 的最快路径

c++ - 是否有一些方法可以使 c++ 类中的一个函数在不同的线程中运行

c++ - 如果我不将预写的字符串保存到变量中,它是否还在内存中?

javascript - 在Ember中,如何通过检查一个键/值从数组中获取对象的所有属性

javascript - 将当前项与原始数组绑定(bind)

c++ - 如果生产者是单线程,依靠 "use_count()"重用 "shared_ptr"内存是否安全?

c++ - 不允许在同一个类中直接访问成员变量

c++ - 检查是否可以删除驱动器

javascript - 如何创建定义长度的预填充数组?