我在一个定义为std::map<const char*, double>
的类中有一个map结构,在构造函数中,我添加了三个全部设置为零的元素,它们的键为“MR_WP”,“MR_WM”和“MR_WC” 。我还有几个访问函数到地图,但在执行访问之前,有一个函数检查以确保键实际存在于地图中。
基本上,我有一些话说:
if ( map.find(_key) == map.end() ) throw "error"
当我将const char *字符串传递给访问函数(如getValue(“MR_WP”))时,没有错误。
但是,如果我这样做:
std::string str = "MR_WP";
double value = map.getValue( str.c_str() );
-or-
std::string str = "MR_WP";
double value = map.getValue( str.data() );
然后抛出错误。我尝试了两个函数,因为我认为错误可能是由null字符引起的。我需要这样做的原因是因为我想在运行时获取密钥的最后一个字母,例如:
std::string type = getType();
std::string str = "MR_W" + type;
double value = map.getValue( str.c_str() ); //or with str.data()
答案 0 :(得分:13)
如果你的地图是std::map<char const*, int>
,那么 - 默认情况下 - 通过比较指针而不是词汇值来比较你的键。
回想一下when you do this会发生什么:
const char* str1 = "Some string";
const char str2[] = "Some string";
std::cout << (str1 == str2 ? "true" : "false");
// Output: false
使用std::map<std::string, int>
代替;它不仅不会让你陷入所有权问题的泥潭,而且它还带有一个现成的比较器!