String::c_str()和String::data()不能转换为const char*

string::c_str() and string::data() not working for conversion to const char*

本文关键字:String const char 转换 str data 不能      更新时间:2023-10-16

我在一个定义为std::map<const char*, double>的类中有一个映射结构,在构造函数中,我添加了三个元素,它们都设置为零,键为"MR_WP"、"MR_WM"answers"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()

如果您的地图是std::map<char const*, int>,则—默认值—通过比较指针来比较键,而不是通过比较词法值。

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

const char* str1   = "Some string";
const char  str2[] = "Some string";
std::cout << (str1 == str2 ? "true" : "false");
// Output: false

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

相关文章: