1. ホーム
  2. c++

[解決済み] char*をstd::mapのキーとして使用する。

2023-04-10 13:59:52

質問

私は、以下のコードが動作しない理由を解明しようとしています。それは、キーの型として 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;
}

どのように解決するのですか?

マップに比較ファンクタを与える必要があります。そうしないと、ポインタを比較し、それが指すヌル文字で終端する文字列を比較しません。 一般に、これはマップのキーがポインタであることを望むときならいつでもそうです。

例えば

struct cmp_str
{
   bool operator()(char const *a, char const *b) const
   {
      return std::strcmp(a, b) < 0;
   }
};

map<char *, int, cmp_str> BlahBlah;