猿问

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

使用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;}


白板的微信
浏览 923回答 3
3回答

慕桂英3389331

你需要给地图提供一个比较仿函数,否则它会比较指针,而不是它指向的以空字符结尾的字符串。通常,只要您希望地图键成为指针,就会出现这种情况。例如:struct&nbsp;cmp_str{ &nbsp;&nbsp;&nbsp;bool&nbsp;operator()(char&nbsp;const&nbsp;*a,&nbsp;char&nbsp;const&nbsp;*b)&nbsp;const &nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;std::strcmp(a,&nbsp;b)&nbsp;<&nbsp;0; &nbsp;&nbsp;&nbsp;}};map<char&nbsp;*,&nbsp;int,&nbsp;cmp_str>&nbsp;BlahBlah;

慕码人2483693

你不能使用,char*除非你绝对100%确定你将使用完全相同的指针访问地图,而不是字符串。例:char *s1; // pointing to a string "hello" stored memory location #12char *s2; // pointing to a string "hello" stored memory location #20如果您访问地图,s1您将获得与访问地图不同的位置s2。
随时随地看视频慕课网APP
我要回答