为什么Test中的地图不会返回其值?这有什么问题?
class Test{ //Test.h
public:
std::map< char*, int> mm;
Test();
void set();
int get( char*);
};
Test::Test(){ //Test.cpp
}
void Test::set(){
mm["aaa"] = 24;
}
int Test::get( char* n){
return mm[n];
}
int main(){ //main.cpp
Test *test = new Test();
test->set();
//this returns 0 instead of 24
printf("From Test: %d\n", test->get("aaa"));
printf("From Test: %d\n", test->mm["aaa"]);
delete test;
//this map works
std::map<char*, int> mm;
mm["a"] = 54;
printf("Local: %d\n", mm["a"]);
return 0;
}
需要额外的文字发布&gt;。&lt;
糟糕!您的问题无法提交,因为:
您的帖子没有太多上下文来解释代码部分;请更清楚地解释一下你的情景。
答案 0 :(得分:4)
它失败,因为您使用char *指针作为键。对于两个文字地址将是不同的。要使地图正常工作,您必须使用其他一些具有运算符&lt;定义。例如std :: string。
答案 1 :(得分:2)
此类型:
std::map< char*, int>;
表示该键是一个指针,它不是一个字符串。这意味着它是一个指针。要更好地理解它,请考虑以下事项:
char* p1, *p2;
p1 = "abc";
p2= "abc";
if (p1==p2) // THIS IS INVALID
为什么最后一行无效?好吧,两者都是指针,并指向一些内存位置,对吧?假设编译器不优化字符串常量,因此"abc"
和 "abc"
的地址会有所不同。因此比较将失败。
你会说,你会使用strcmp
。究竟!这就是重点,map::find
不知道是否使用字符串比较例程!它只是比较两个指针,你得到无效的结果。因此,最好使用字符串类(std::string
),或将比较器传递给map
。
答案 2 :(得分:1)
//这会返回0而不是24
printf(“来自测试:%d \ n”,test-&gt; get(“aaa”));
因为“aaa”的内存地址与您存储的地图不同,
mm [“aaa”] = 24并且get(“aaa”)不是同一个指针。
答案 3 :(得分:0)
不要将指针值用作map / hash的键。 键类型,也许你可以使用std :: string。
map<string, int> mm; // this would work.
PS:
p1 = "abc";
p2= "abc";
我认为,无论p1是否等于p2,很难说,这取决于编译器的实现。