2013-04-16 5 views
2

mis à jour avec FIXnombre Distinct de chaînes dans un tableau

Je veux retourner seulement le nombre d'entrées uniques dans mon tableau. Le tableau contient une variable de chaîne qui représente l'adresse IP. S'il y a 10 d'entre eux, mais de 3 types différents, je veux juste revenir 3. J'ai été à ce jour toute la journée et n'arrive pas à trouver une solution qui fonctionne. Mon code:

Code d'origine

int getUnique(Visitors info[], string url, string startDate, string endDate){ 

int count = 0; 

string temp; 

for(int i = 0 ; i < N ; i++){ 

    if(url == info[i].URL && (dateChecker(startDate, endDate, info[i].dateAccessed))){ 



    } 

} 

return count; 

} 

code mis à jour

int getUnique(Visitors info[], string url, string startDate, string endDate){ 

set<string> ips; 

for(int i = 0 ; i < N ; i++){ 

    if(url == info[i].URL && (dateChecker(startDate, endDate, info[i].dateAccessed))){ 

     ips.insert(info[i].IP); 

    } 

} 

return ips.size(); 

} 

La première se vérifie si l'URL correspondante ne en match de fait, et le juste dateChecker assure que la date à laquelle l'adresse IP particulière est allé à cette URL est entre les 2 dates dépassées (startDate et endDate). Comment puis-je obtenir le nombre de différentes adresses IP dans ces conditions?

+0

Vous ne devriez pas changer la question originale avec le correctif sinon les lecteurs venant plus tard ne comprendront pas ce qui s'est passé. En général, vous souhaitez ajouter une section d'édition à la fin de votre question. –

+0

Editer la question pour montrer le code original et "fixe". –

Répondre

2

Utilisez std::set, il stocke des éléments uniques et il est efficace:

std::set<string> ips; 

for (int i=0; i<N; i++) 
    ips.insert(info[i].IP); 

int unique_ips = ips.size(); 
+0

désolé les adresses IP sont une variable de l'objet de classe (info [i] .IP) – Sherifftwinkie

+0

Wow, je n'ai jamais entendu parler de cela. Donc, fondamentalement, c'est une structure de données qui stockera seulement une occurrence de chaque chaîne différente ou type de données que vous lui lancez. Donc, si je l'utilisais pour ints et j'ai ajouté comme {1, 1, 6, 6, 4, 1, 15}. Il serait juste stocker 1, 6, 4 et 15? – Sherifftwinkie

+0

Oui, exactement. Tu as le point. – deepmax

1

Vous pouvez utiliser un std::set pour garder la trace des string uniques s:

std::set<std::string> mySet ; 

pour chaque itération le faire:

mySet.insert(info[i].IP) ; 

et à la fin:

return mySet.size() ; 
1

Vous peut le faire paresseusement avec l'ensemble

std::set<string> uniq; 
if(url == info[i].URL && (dateChecker(startDate, endDate, info[i].dateAccessed))){ 
     uniq.insert(info[i].URL); 
} 

return uniq.size(); 
1

Comme nous l'avons mentionné, vous devez utiliser std :: set mais il n'y a pas besoin de tableau itérer manuellement, depuis std :: carte accepte les itérateurs pour qu'il soit construit à partir de. Ainsi

std::map<std::string> unique(strinvec.begin(), stringvec.end()); 

devrait faire l'affaire.
Et si vous ne devez connaître que le nombre d'éléments uniques, vous pouvez utiliser une notation encore plus courte.

size_t unique_count = std::map<std::string>(strinvec.begin(), stringvec.end()).size(); 
Questions connexes