簡體   English   中英

C ++:如何制作一個簡單的字典?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM