2010-11-05 6 views
1

Ok, le problème est assez simple - je lis les mots du flux d'entrée, les mots peuvent répéter. J'ai besoin de remplir une carte pour que tous les mots obtiennent des indices de 0 à n-1. Voici mon code:`auto-increment` std :: map <string, int> :)

map<string, int> mp; 
string s; 
int n = 0; 
while(cin >> s) 
{ 
    if(mp.find(s) == mp.end()) 
    { 
     mp.insert(make_pair(s, n++)); 
    } 
} 

Est-ce la meilleure façon d'obtenir ce que je veux réaliser ou y at-il plus élégant, plus de solutions STL-ish? Merci d'avance

+0

Cela semble suffisant. – prolink007

+0

Pourquoi avez-vous besoin d'un index? Utilisez-vous ceci pour mapper un mot à un index dans un vecteur où vous stockez plus d'informations dans le vecteur. Pourquoi ne pas simplement stocker les informations sur la carte? –

+0

@Martin: Finalement, je vais construire une matrice d'adjacence pour un graphique dont les sommets sont ces chaînes. utiliser des index comme des sommets de graphique est pratique –

Répondre

7

Vous n'avez pas besoin de vérifier s'il existe un élément sur cette clé avant l'insertion car insert ne modifie pas la valeur mappée si la clé existe déjà. Vous n'avez pas besoin de suivre le compte séparément; vous pouvez simplement appeler size() pour obtenir la valeur suivante:

while (std::cin >> s) 
{ 
    mp.insert(std::make_pair(s, mp.size())); 
} 
+0

Je savais qu'il y avait un meilleur moyen !!! Merci! Ça a l'air génial! –

+1

+1 ** amour ** l'utilisation de 'size()'! :) – wilhelmtell

Questions connexes