当我尝试向我的地图(名为child)插入一个值时,它会给出分段错误。我无法理解我的方法究竟是什么问题(注释和非注释)。
struct trienode{
map < char , struct trienode* > child;
bool eow;
}; typedef struct trienode trienode;
void insert_trie(trienode* root,string mystr){
int len = mystr.length();
int p=0;
char ch=mystr.at(p);
trienode* temp=root;
while(p<len){
map<char, trienode* >::iterator itr=(temp->child).find(ch);
if( itr!=(temp->child).end()){
temp=itr->second;
p++;
ch=mystr.at(p);
}
else{
trienode* temp2;
temp2=(trienode*)malloc(sizeof(trienode));
temp->child.insert(make_pair(ch,temp2));//segmentation fault occure on this line or line below it.
//(temp->child)[ch]=temp2;
if(p==len-1){
temp2->eow=true;
}
else{
temp2->eow= false;
temp=temp2;
}
p++;
ch=mystr.at(p);
}
}
}
答案 0 :(得分:1)
您需要使用new
,而不是malloc
。否则std::map
将不会被初始化。并且段错误可能发生在std::map
的复制构造函数中。
您可以std::map<char,trienode>
使用child
并避免所有这些错误。
std::map::operator[]
为您插入项目,如果您确保trienode::eow
初始化为false,则可以依赖它。