[英]C++: How to make a simple dictionary?
我正在嘗試用2個字符的單詞創建一個字典,但沒有那么成功這里是我的代碼:
#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,所以我習慣了引用,而不是指針,所以我可能錯了。 我想學習如何正確使用地圖,那么請問我在這里應該做些什么?
謝謝
//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。
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
這避免了比較指針和超出范圍的數組的整個問題,在地圖中留下懸空指針。
讓我們看看你的代碼:
你有一個std::map<char *, int>
。 第一個“char *”可疑是地圖的關鍵。 將指針存儲為關鍵通常不是你真正想做的事情。 但我們繼續閱讀。 在你的循環中你有一個你填充的本地數組。 然后使用該變量索引到地圖中。 請記住,地圖的關鍵是char *。 在每次循環迭代中,數組s的地址可能相同。 因此,您可能只將一個項目放入地圖中,並且它只保存您放入s中的最新值。 但等等,情況變得更糟。 一旦完成循環,s就會超出范圍,現在是Undefined Behavior,用於取消引用當前存儲在映射中的指針(作為該映射中唯一元素的鍵。輸出m.size()到校驗)。
將您的地圖重新定義為std::map<std::string, int>
以便不會遇到所有這些問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.