#include <iostream>
using namespace std;
#include <string>
#include <map>
typedef struct node{
char a;
map<char , node*> b;
}node;
node a[26] ;
void add(string s){
node *prev = &(a[s[0]-'a']);
int i = 0;
int len = s.length();
for(i = 1; i < len; ++i){
map<char,node*>::iterator it = ((*prev).b).find(s[i]);
if(it != ((*prev).b).end()){
prev = it->second;
}
else{
cout << (*prev).a << endl;
node pt;
pt.a = s[i];
((*prev).b)[s[i]] = &pt;
prev = &pt;
}
}
}
int main(){
string s = "helloworld";
string t = "htllothis";
int i = 0 ;
for(i = 0;i < 26;++i){
a[i].a = 'a'+i;
}
add(s);
add(t);
return 0;
}
我正在尝试使用map和char实现轮胎数据结构,但cout<< (*prev).a
正在打印其他一些字符。我做错了什么?
答案 0 :(得分:4)
首先(*prev).b
相当于prev->b
,我不明白你为什么使用->
作为迭代器而不是这个指针,很难读取你的代码。
将指向本地对象的指针插入地图的主要问题:
cout << (*prev).a << endl;
node pt;
pt.a = s[i];
((*prev).b)[s[i]] = &pt;
prev = &pt;
离开此块后,指针变为无效,并且您会收到随机错误。您应该按运算符new创建节点,并在地图中更好地使用智能指针,或者按值保留节点。
答案 1 :(得分:0)
(...)
node pt;
pt.a = s[i];
((*prev).b)[s[i]] = &pt;
prev = &pt;
(...)
在add
功能中,您创建本地node
并将其地址传递到地图的条目中,然后将其设为prev
节点。一旦变量超出范围,它就会被删除,并且您的prev
节点指向无效的地址。因此,下次打印prev
时,任何事情都可能发生,因为它是未定义的行为。