string :: c_str()和string :: data()无法转换为const char*

Max*_*Max 0 c++

我在一个定义为的类中有一个map结构std::map<const char*, double>,在构造函数中,我添加了三个全部设置为零的元素,它们的键为"MR_WP","MR_WM"和"MR_WC".我还有几个访问函数到地图,但在执行访问之前,有一个函数检查以确保键实际存在于地图中.

基本上,我有一些说法:

if ( map.find(_key) == map.end() ) throw "error"
Run Code Online (Sandbox Code Playgroud)

当我将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() );
Run Code Online (Sandbox Code Playgroud)

然后抛出错误.我尝试了两个函数,因为我认为错误可能是由null字符引起​​的.我需要这样做的原因是因为我想在运行时获取密钥的最后一个字母,例如:

std::string type = getType();

std::string str = "MR_W" + type;

double value = map.getValue( str.c_str() ); //or with str.data()
Run Code Online (Sandbox Code Playgroud)

Lig*_*ica 13

如果您的地图是std::map<char const*, int>,那么 - 默认情况下 - 通过比较指针而不是词汇值来比较您的键.

回想一下当你这样做时会发生什么:

const char* str1   = "Some string";
const char  str2[] = "Some string";

std::cout << (str1 == str2 ? "true" : "false");
// Output: false
Run Code Online (Sandbox Code Playgroud)

用一个std::map<std::string, int>代替; 它不仅不会让你陷入陷入泥潭的所有权问题中,而且它还带有一个现成的比较器!