存储指针错误/未正确使用Unordered_map.find

时间:2014-12-08 10:53:00

标签: c++11 compiler-construction

因此标题基本上都说明了一切。我正在用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".

所以问题。为什么它找到了密钥,并且知道它找到了密钥,但同时返回它已经到达符号堆栈的末尾而没有找到它?我现在一直在试图解决这个问题。这是我的指针以某种方式关闭?非常感谢任何见解。

2 个答案:

答案 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 *类型的键。