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

时间:2013-05-15 20:14:52

标签: c++ string map 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为NULL。问题是将std::wstring::c_str的值与const wchar_t*进行比较还是代码中的其他地方?

2 个答案:

答案 0 :(得分: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()];

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

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

答案 1 :(得分:1)

我实际上并没有在你的示例代码中看到std :: map - 我看到一个std :: map&lt;&gt; :: 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