std :: wstring无法使用std :: map <const wchar_t*的[]运算符,const char*>

smo*_*190 2 c++ string std map

我有一个const std::map<const wchar_t*, const char*>在全局命名空间中.它看起来像这样:

.h文件

typedef std::map<const wchar_t*, const char*> ShaderMap;

const ShaderMap::value_type rawShaderData[] = {
    ShaderMap::value_type( L"BasicShader_Vertex", 
        "..."
    ),
);

const int ElementCount = 2; //Length of rawShaderData
extern ShaderMap ShaderProgramsMap;
Run Code Online (Sandbox Code Playgroud)

.cpp文件

ShaderMap ShaderProgramsMap = ShaderMap( rawShaderData, rawShaderData + ElementCount );
Run Code Online (Sandbox Code Playgroud)

我试图在我的代码中的其他地方访问它,如下所示:

std::wstring shaderKey = std::wstring( name + L"_Vertex" );
...
pShaderData = ShaderProgramsMap[shaderKey.c_str()];
Run Code Online (Sandbox Code Playgroud)

使用调试器shaderKey是"BasicShader_vertex"但是pShaderData为NULL.与值进行比较的问题std::wstring::c_strconst wchar_t*或者是一些其他地方的代码?

Dav*_*vid 5

std::wstring shaderKey1 = std::wstring( name + L"_Vertex" );
ShaderProgramsMap[shaderKey1.c_str()] = "Whatever";

std::wstring shaderKey2 = std::wstring( name + L"_Vertex" );
pShaderData = ShaderProgramsMap[shaderKey2.c_str()];
Run Code Online (Sandbox Code Playgroud)

返回的指针shaderKey1.c_str()不一样shaderKey2.c_str().它们是两个不同的字符串,它们都分配了自己的数据,并为您提供了指向该分配的指针.他们恰好存储相同的数据,但你只是看指针.如果要按字符串搜索和排序,请将密钥设为a std::wstring,而不是a const wchar_t*.沿着同样的路线,价值也很可能std::string不是const char*,但我会让你决定.

原始方法的另一个问题是,返回的指针shaderKey.c_str()一旦shaderKey超出范围就会悬空.

  • 或者保持`map <wchar_t const*,wchar_t const*>`,使用自定义比较器(使用例如`strcmp`)并准备UB因为悬空指针. (2认同)