为了账号安全,请及时绑定邮箱和手机立即绑定

使用char *作为std :: map中的键

使用char *作为std :: map中的键

C++
白板的微信 2019-08-19 10:23:04
使用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;


查看完整回答
反对 回复 2019-08-19
?
慕码人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。


查看完整回答
反对 回复 2019-08-19
  • 3 回答
  • 0 关注
  • 922 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信