2010-11-21 13 views
2

Je voudrais faire une fonction qui peut compter les mots uniques. Par exemple:Nombre de mots uniques dans l'aide C++?

«J'aime programmer quelque chose d'utile, et j'aime manger, manger de la glace maintenant.

Dans ce cas, chaque mots uniques:

I occurs 2 
like occurs 2 
... 

J'ignorera le cas plus tard. S'il vous plaît aider

EDIT:

J'ai fini écrire les fonctions. Cela fonctionne parfaitement. Merci pour votre aide. Très apprécié.

Répondre

2

Semble que vous voulez utiliser un std::map avec une chaîne de clé et des données int.

Si un élément n'existe pas dans la carte, vous l'ajoutez déjà avec une valeur int égale à 1. Si l'élément existe déjà dans la carte, ajoutez simplement 1 à sa valeur associée.

+0

je vois. Si j'utilise map, serai-je capable de le trier plus tard? comme tri par fréquence –

+0

pourriez-vous s'il vous plaît, me guider, si mon scénario est similaire à ceci: http://forum.codecall.net/c-c/3162-need-help-w-word-count-program-asap.html. J'en ai besoin très urgent –

+0

@cpp_learner: Si vous n'êtes pas sûr d'un autre aspect, vous pouvez poser une autre question sur ce qui vous trouble. –

1

Je vais traiter cela comme une question de devoirs (espérons que personne ne sera aussi irréfléchi que de présenter un code complet).

Si vous êtes satisfait d'une définition très vague de "mot", alors l'entrée iostream divise déjà l'entrée en mots pour vous.

Ensuite, utilisez par ex. std::map pour compter des mots distincts.

Vive & HTH.,

+0

oui, c'est un devoir. Je viens d'apprendre cpp en 2 semaines –

+1

oh ya, je ne m'attends pas à un code complet. Un exemple de code d'utilisation de map etc fera l'affaire. Je vais explorer plus par moi-même plus tard –

+1

@cpp_learner: Pour des exemples sur l'utilisation de 'std :: map' ou de toute autre construction de bibliothèque std en C++, voir http: // cplusplus.com/reference/ – rubenvb

1

Il est une excellente occasion de se familiariser avec les itérateurs et algorithmes standard.

Il existe std::istream_iterator qui itère sur la liste des mots tirés d'un flux donné, soit std::cin, soit un fichier ou une chaîne. Il y a std::unique qui peut vous aider dans votre objectif.

Exemple de programme:

#include <algorithm> 
#include <iostream> 
#include <vector> 

using namespace std; 


int main() 
{ 
    istream_iterator<string> begin(cin), end; 
    vector<string> tmp; 

    copy(begin, end, back_inserter(tmp)); 
    sort(tmp.begin(), tmp.end()); 
    vector<string>::iterator it = unique(tmp.begin(), tmp.end()); 

    cout << "Words:\n"; 
    copy(tmp.begin(), it, ostream_iterator<string>(cout)); 
} 

S'il vous plaît se référer à http://www.cplusplus.com pour référence ultérieure sur la bibliothèque standard.

+0

Bien essayé: Mais istream_iterator définit les mots comme étant séparés par des espaces. Ce qui est bien pour la plupart des contextes. Mais ici la ponctuation entrera en jeu. Aussi, pourquoi utiliser un vecteur lorsqu'une carte triera et comptera automatiquement le contenu tel qu'il est. –

+0

Vous n'êtes pas sûr que le tri à la fin soit plus difficile que le tri en ligne ... –