Compter le nombre de chaînes uniques dans le tableau

J'ai essayé de créer un programme simple pour compter le nombre de chaînes uniques dans un tableau, mais je ne trouve toujours pas de solution pour savoir quoi faire si la chaîne se répétait plus de deux fois.

Voici un exemple du code, où "Tommy" existe 3 fois dans le tableau. Ainsi, lorsque je compte le nombre de non uniques, il devrait être 3, et seuls 2 noms sont uniques.

#include <iostream>
#include <string>
using namespace std;
int main()
{
string stringArray[5] = { "Tommy", "Sammy", "Tommy", "Wally", "Tommy" }, repeatedArray[5];
int instance = 0, notUnique = 0, repeated = 0;
for (int i = 0; i < 5; i++)
{
for (int j = i + 1; j < 5; j++)
{
if (stringArray[i] == stringArray[j] && stringArray[i]!= repeatedArray[repeated])
{
instance++;
}
}
if (instance == 1)
{
notUnique += 2;
}
else if (instance >= 2)
{
notUnique += instance + 1;
repeatedArray[repeated] = stringArray[i];
repeated++;
}
instance = 0;
}
cout << "Number of non-unique strings in array is:" << notUnique << endl;
}


Solution du problème

EDIT : J'ai dû lire cela deux fois pour comprendre ce que vous vouliez compter. Heureusement, l'approche que j'avais en tête est adaptable pour cela, donc:

Un moyen simple serait de se souvenir de la fréquence à laquelle vous avez trouvé les chaînes d'une manière facilement accessible. Je pense à std::map:

#include <iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
string stringArray[5] = { "Tommy", "Sammy", "Tommy", "Wally", "Tommy" };
std::map<string, int> count_find;
int non_unique_count = 0, unique_count = 0;
for(auto &s: stringArray) {
// Note: This uses that std::map::operator[] zero-initializes when it is
// called for a new key, so crucially, we start with 0 (not uninitialized)
int count = ++count_find[s];
if(count == 1) { // when a string is found the first time
++unique_count; // tentatively mark it as unique
} else if(count == 2) { // when it is found the second time
--unique_count; // unmark as unique
non_unique_count += 2; // and chalk both found strings up as non-unique
} else { // after that,
++non_unique_count; // just chalk up as non-unique.
}
}
std::cout << unique_count << ", " << non_unique_count << std::endl;
}

Alternativement, vous pouvez calculer le non_unique_countà partir de la unique_countfin de la boucle, comme dans

for(auto &s: stringArray) {
int count = ++count_find[s];
if(count == 1) { // when a string is found the first time
++unique_count; // tentatively mark it as unique
} else if(count == 2) { // when it is found the second time
--unique_count; // unmark as unique
}
}
int non_unique_count = 5 - unique_count;

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"