使用char *作为std :: map中的键我试图弄清楚为什么以下代码不起作用,我假设使用char *作为键类型是一个问题,但我不知道如何解决它或为什么它发生。我使用的所有其他功能(在HL2 SDK中)使用char*这样std::string会导致很多不必要的复杂化。std::map<char*, int> g_PlayerNames;int PlayerManager::CreateFakePlayer(){
FakePlayer *player = new FakePlayer();
int index = g_FakePlayers.AddToTail(player);
bool foundName = false;
// Iterate through Player Names and find an Unused one
for(std::map<char*,int>::iterator it = g_PlayerNames.begin(); it != g_PlayerNames.end(); ++it)
{
if(it->second == NAME_AVAILABLE)
{
// We found an Available Name. Mark as Unavailable and move it to the end of the list
foundName = true;
g_FakePlayers.Element(index)->name = it->first;
g_PlayerNames.insert(std::pair<char*, int>(it->first, NAME_UNAVAILABLE));
g_PlayerNames.erase(it); // Remove name since we added it to the end of the list
break;
}
}
// If we can't find a usable name, just user 'player'
if(!foundName)
{
g_FakePlayers.Element(index)->name = "player";
}
g_FakePlayers.Element(index)->connectTime = time(NULL);
g_FakePlayers.Element(index)->score = 0;
return index;}
3 回答
慕桂英3389331
TA贡献2036条经验 获得超8个赞
你需要给地图提供一个比较仿函数,否则它会比较指针,而不是它指向的以空字符结尾的字符串。通常,只要您希望地图键成为指针,就会出现这种情况。
例如:
struct cmp_str{ bool operator()(char const *a, char const *b) const { return std::strcmp(a, b) < 0; }};map<char *, int, cmp_str> BlahBlah;
慕码人2483693
TA贡献1860条经验 获得超9个赞
你不能使用,char*除非你绝对100%确定你将使用完全相同的指针访问地图,而不是字符串。
例:
char *s1; // pointing to a string "hello" stored memory location #12
char *s2; // pointing to a string "hello" stored memory location #20
如果您访问地图,s1您将获得与访问地图不同的位置s2。
- 3 回答
- 0 关注
- 922 浏览
添加回答
举报
0/150
提交
取消