2013-03-01 22 views
2

我試圖與2個字符的字的字典,但沒有這麼多的成功 這裏是我的代碼:C++:如何製作一個簡單的字典?

#include <cstdlib> 
#include <iostream> 
#include <map> 
using namespace std; 

int main(int argc, char *argv[]){ 
    map<char*,int> m; 
    //input 5 two-lengthed words 
    for (int i=0;i<5;i++){ 
     char s[3]; 
     cin>>s; 
     s[2] = '\0'; 
     m[s]=1; //add a key 
    } 
    //checking if a word exists. 

    cout<<"Word you want to check whether it exists:"<<endl; 
    char chck[3]; 
    cin>>chck; 
    chck[2]='\0'; 
    //I heard this is how you check whether a key exists: 
    bool exists = m.find(chck)==m.end(); 
    cout<<((exists)?"Yes!":"No.")<<endl; 
    system("pause"); //Yea, system, I know. 
    return 0; 
} 

每當我進入的話,然後當我想查一個字是否是在一本字典,我總是打印出「號碼」?
我來自Java所以我習慣了引用,而不是指針,所以這就是我可能錯誤的地方。我想學習如何正確使用地圖,所以你可以請我在這裏應該做什麼?

感謝

+1

有'C++'中的引用,你可以*幾乎*總是使用它們而不是點(我說*幾乎*非常輕微)。不用'*'來指定指針,而是用'&'來引用。 – RageD 2013-03-01 21:39:03

+2

問題就像你想的 - 指針與引用。你的地圖存儲指向字符的指針作爲關鍵字,因爲它們都在堆棧中,所以它們永遠不會相同。你可以使用字符串而不是char *嗎? – 2013-03-01 21:42:41

+0

對於它的價值,Java變量(對於引用類型)的FAR更像C++指針,而不像C++引用。 – 2016-10-11 18:39:52

回答

6
//I heard this is how you check whether a key exists: 
bool exists = m.find(chck)==m.end(); 

是的,但如果元素存在的條件爲真。你應該打電話給你vaviable notExists

bool notExists = m.find(chck)==m.end(); 

現在,如果你想要做的是檢查是否存在的工作,你可以使用一個std::set<std::string>。如果你想讓這個詞成爲別的關鍵,那麼你需要std::map<std::string, SomeThingElse>

忘掉那些char*。使用std::string s。

+1

或者只是'布爾存在= m.find(chck)!= m.end();' – 2013-03-01 21:43:00

+0

嗯,是的,你就在那裏。 但我仍然得到「是!」而不是 當它存在與否。 – SmRndGuy 2013-03-01 21:45:39

+0

@SmRndGuy可能是您的代碼中的其他錯誤。有關示例,請參見[本演示](http://ideone.com/IbWb0p)。 – juanchopanza 2013-03-01 21:52:48

2
m[s]=1; //add a key 

每次你「添加一個鍵」,你實際上只是得到相同的元素,使用相同的鍵。關鍵是數組的地址s,而不是輸入的字符串的值。

嘗試打印出來的容器的大小,你會看到一個元素:

std::cout << m.size() << '\n'; 

當你在一個容器中放了char*,並使用默認的比較功能,他們只當他們是比較平等相同的指針,而不是相同的字符串:

char s1[] = "foo"; 
char s2[] = "foo"; 
assert(s1 == s2); // FAILS! 

要推字符串值到容器使用std::string鍵,不char*

std::string s1 = "foo"; 
std::string s2 = "foo"; 
assert(s1 == s2); // passes 

這樣可以避免比較指針和數組超出範圍而在地圖上留下懸掛指針的問題。

2

讓我們看看你的代碼位:

你有std::map<char *, int>。第一個「char *」作爲地圖的一個關鍵是可疑的。將指針存儲爲關鍵並不是你真正想做的事情。但我們繼續閱讀。在你的循環內部你有一個你填充的本地數組。然後你使用該變量來索引到地圖中。請記住,地圖的關鍵是一個char *。數組s的地址在每次循環迭代中可能都是相同的。因此,您可能只會將一件物品放入您的地圖中,並且它僅保留您放入地圖的最新值。但是等一下,情況會變得更糟。只要循環完成,s就超出範圍,現在它是Undefined Behavior以取消引用當前存儲在地圖中的指針(作爲該地圖中唯一元素的關鍵字。)輸出m.size()爲校驗)。

將您的地圖重新定義爲std::map<std::string, int>,以避免發生所有這些問題。

+0

您可以使用\'字符來標記代碼,反引號內的文本不會被視爲HTML,因此您可以使用'<' and '>'而不是>和< – 2013-03-01 21:57:27