J'essaie de comprendre pourquoi le code suivant ne fonctionne pas. Je suppose qu'il s'agit d'un problème lié à l'utilisation de char* comme type de clé, mais je ne sais pas comment le résoudre ni pourquoi il se produit. Toutes les autres fonctions que j'utilise (dans le SDK HL2) utilisent char*
donc en utilisant std::string
va causer beaucoup de complications inutiles.
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;
}
16 votes
Parfois, faire la bonne chose fait mal au début. Changez votre code pour utiliser
std:string
une fois, et être heureux après.1 votes
Quel genre de complications ? il existe une conversion implicite de char* en std::string.
1 votes
Vous ne devez pas utiliser
char*
comme une clé de carte. Voir ma réponse pourquoi.0 votes
Cela semble être une complication inutile causée par no en utilisant
std::string
.0 votes
Je ne comprends pas, pour utiliser une clé binaire, la carte ne devrait-elle pas savoir si une clé est égale au lieu de savoir qu'une clé a une valeur "inférieure" à une autre ?
0 votes
Vous devriez probablement utiliser le CUtlRBTree de Source.