C++ -使用const char* key向Map添加字符串键将创建新元素,而不是修改[duplicate]

rqdpfwrv  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(126)
    • 此问题在此处已有答案**:

Using char* as a key in std::map(10个答案)
Error trying to find const char* key from std::map(2个答案)
Using const char* as key for map/unordered_map(3个答案)
Pointers as keys in map C++ STL(5个答案)
2天前关闭。
我有一个简单的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", false;}

xfyts7mz

xfyts7mz1#

如果你真的想用C字符串作为键,你需要提供一个用户定义的比较器,否则Map将比较实际的指针值,而不是它们所指向的C字符串。
示例:

#include <cstring>
#include <iostream>
#include <map>
#include <string>

// a comparator class for C strings
struct cstring_less {
    bool operator()(const char* lhs, const char* rhs) const {
        return std::strcmp(lhs, rhs) < 0;
    }
};

int main() {
    // supply the comparator as the third template parameter:
    std::map<const char*, bool, cstring_less> test = {
        {"Test", false},
        {"test2", false}
    };
    
    std::string s = "Test";
    test[s.c_str()] = true;

    for(auto&[k,v] : test) {
        std::cout << k << ' ' << v << '\n';
    }
}

不过,我还是建议您使用std::string作为 * Key *。
当前的map不能被使用,如果你存储指针的任何C字符串(不是字符串常量)已经超出了作用域。你存储的指针是"悬空的",解引用它们会使程序具有 * 未定义的行为 *。

相关问题