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

标签 c++ string dictionary std

我有一个 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一片空白。比较 std::wstring::c_str 的值有问题吗?至 const 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() 不同。它们是 2 个不同的字符串,它们都分配了自己的数据并为您提供了指向该分配的指针。它们恰好存储相同的数据,但你只是在看指针。如果您想按字符串搜索和排序,请将键设置为 std::wstring,而不是 const wchar_t*。同样,该值也很可能是 std::string,而不是 const char*,但我会让您自行决定。

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

关于c++ - std::wstring 不适用于 std::map<const wchar_t*, const char*> 的 [] 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16574156/

相关文章:

c++ - 在 MATLAB 和 C++ 之间交换数据最有效的方法?

python - 将字典拆分为现有列

java - 使用哪种数据结构或算法来安排字典数据以进行序列搜索?

c++ - 检查链表是否是回文

c++ - 自制删除如果是空间

javascript - 从文本 block 获取数字

javascript - 将 HTML 字符串解析为 DOM 并将其转换回字符串

javascript - 转换字符串以访问它的 dom 元素

Python 映射 lambda 过滤器帮助使用 IF

java - 进程和多个jvm