C ++:如何制作一个简单的字典?

时间:2013-03-01 21:37:09

标签: c++ 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 所以我习惯了引用,而不是指针,所以我可能错了。我想学习如何正确使用地图,那么请问我在这里应该做些什么?

感谢

3 个答案:

答案 0 :(得分: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 :(得分: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 :(得分:2)

让我们看一下你的代码:

你有std::map<char *, int>。第一个“char *”可疑是地图的关键。将指针存储为关键通常不是你真正想做的事情。但我们继续阅读。在你的循环中你有一个你填充的本地数组。然后使用该变量索引到地图中。请记住,地图的关键是char *。在每次循环迭代中,数组s的地址可能相同。因此,您可能只将一个项目放入地图中,并且它只保存您放入s中的最新值。但等等,情况变得更糟。一旦完成循环,s就会超出范围,现在是Undefined Behavior,用于取消引用当前存储在映射中的指针(作为该映射中唯一元素的键。输出m.size()到验证)。

将您的地图重新定义为std::map<std::string, int>以解决所有这些问题。