我正在尝试制作一个包含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 所以我习惯了引用,而不是指针,所以我可能错了。我想学习如何正确使用地图,那么请问我在这里应该做些什么?
感谢
答案 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>
以解决所有这些问题。