因此标题基本上都说明了一切。我正在用c ++编写一个符号表,用于我正在处理的编译器项目,除了查找表中的标识符外,一切顺利。
这就是我存储到表中的方式(伪似的):
vector<symbolTable*>* symbolStack = new symbolTable();
//where a symbolStack is a vector of unordered_maps (symbolTables),
//each iteration in vector referencing a new block of code.
string* check = new string(root->children[0]->lexicode->c_str());
symbol* sym = new symbol();
...... //setting sym info
symbol_entry pair = make_pair(check, test)
//the unordered_map has keys of (string*, symbol*)
symbolStack[tableNumber]->insert(pair);
我非常可靠,因为我测试了从地图上打印尺寸/信息,所有这些似乎都按预期存储。这就是我遇到问题的地方(以后会在不同的功能中发生):
for(int i = 0; i =< tableNumber;i++){
auto finder = symbolStack[i]->find(checkS) //checkS == check from above
if(finder == symbolStack[i]->end()) cout<<not found;
else cout<<we did it!!!!
我的其他事永远无法达成。但是,如果我这样做,假设字符串* - &gt; c_str()==“test”:
cout<<string->c_str(); // prints out "test"
cout<<finder->second->c_str() //prints out "test".
所以问题。为什么它找到了密钥,并且知道它找到了密钥,但同时返回它已经到达符号堆栈的末尾而没有找到它?我现在一直在试图解决这个问题。这是我的指针以某种方式关闭?非常感谢任何见解。
答案 0 :(得分:0)
对我自己的问题有点回答。
首先我会这样说:我已经得出结论与find()或类似方法的比较不起作用,因为由于某种原因指针不匹配。我不知道为什么这仍然是,或者我做错了。
我为解决问题和完成代码所做的是:
for(int k = 0; k<= tableNumber; k++){
unordered_map<string*,symbol*>::iterator it;
for(it = symbolStack[k]->begin(); it != symbolStack[k]->end(); it++)
{
string a = targetString->c_str();
string b = it->first->c_str();
if(a.compare(b) == 0) cout<<"You have found the match! \n";
}
}
}
因此,如果其他人在类似的船上,这就解决了如何让它以实用方式工作的问题,但是并没有真正回答为什么我的其他尝试失败,除了注意到指针值不同。
答案 1 :(得分:0)
在symbolTable
中,您将指向字符串的指针存储为键,而不是字符串本身。因此unordered_map
比较指针而不是字符串,并且找不到匹配的项目。当您重建键字符串时(如在答案中,使用string b = it->first->c_str()
),字符串上的比较再次起作用。因此,您需要在string
中存储string *
而不是symbolTable
,或者您需要提供自己的比较函数来比较string *
类型的键。