C++中用string转const char*修改map元素却新增条目问题
问题:
map<const char*, bool>修改值时新增重复键条目 代码示例:
map<const char*, bool> test = { {"Test", false}, {"test2", false} }; string s = "Test"; test[s.c_str()] = true;
执行后map中出现两个键名相同的条目:
{"Test", false}, {"test2", false}, {"Test", true} // 注:原示例中值写false为笔误,实际应为true
原因分析
std::map默认使用指针的内存地址进行键比较,而非字符串内容。- 初始化时的
"Test"是字符串字面量,存储在程序的只读数据段;而string::c_str()返回的是std::string对象内部动态分配缓冲区的地址,二者内存地址完全不同。 - 由于地址不同,
map判定这是两个不同的键,因此会新增一条目而非修改原有值。
解决方案
方法1:改用std::string作为键(推荐)
直接将map的键类型替换为std::string,它会自动按字符串内容进行比较,代码简洁且不易出错:
#include <map> #include <string> using namespace std; int main() { map<string, bool> test = { {"Test", false}, {"test2", false} }; string s = "Test"; test[s] = true; // 正确修改原有键对应的值 return 0; }
方法2:自定义比较器(保留const char*键时使用)
如果必须使用const char*作为键,给map传入自定义比较函数,通过strcmp比较字符串内容:
#include <map> #include <string> #include <cstring> using namespace std; struct CStrComparator { bool operator()(const char* a, const char* b) const { return strcmp(a, b) < 0; } }; int main() { map<const char*, bool, CStrComparator> test = { {"Test", false}, {"test2", false} }; string s = "Test"; test[s.c_str()] = true; // 正确匹配并修改原有值 return 0; }
内容的提问来源于stack exchange,提问作者elllkere
相关产品推荐
相关产品推荐

