std::wstring 不适用于 std::map<const wchar_t*、const char*的 [] 运算符>

std::wstring not working with the [] operator of std::map<const wchar_t*, const char*>

本文关键字:const std char gt 运算符 wchar 不适用 wstring 适用于 map lt      更新时间:2023-10-16

我有一个位于全局命名空间中的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;

.cpp文件

ShaderMap ShaderProgramsMap = ShaderMap( rawShaderData, rawShaderData + ElementCount );

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

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

使用调试器,shaderKey为"BasicShader_vertex",但pShaderData为NULL。比较std::wstring::c_strconst wchar_t*的值有问题吗?还是代码中的其他地方有问题?

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()];

shaderKey1.c_str()返回的指针与shaderKey2.c_str()返回的指针不同。它们是两个不同的字符串,它们都分配了自己的数据,并为您提供了一个指向该分配的指针。它们碰巧存储了相同的数据,但您只查看指针。如果要按字符串搜索和排序,请将关键字设为std::wstring,而不是const wchar_t*。同样,值也很可能是std::string,而不是const char*,但我让您自己决定。

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

在您的示例代码中,我实际上没有看到std::map——我看到的是std::map<>:value_type元素(即const char*(。

所以,const ShaderMap::value_type ShaderProgramsMap[] = { ... };

实际上是:std::pair<wchar_t const* const, char const*> const ShaderProgramsMap[] = { ... }

而且,pShaderData = ShaderProgramsMap[shaderKey.c_str()];

实际上是:

int nArrayIndex = int(shaderKey.c_str());
pShaderData = ShaderProgramsMap[nArrayIndex]; // actually an array, not a map