Split en c++ avec les conteneurs standard

Soyez le premier à donner votre avis sur cette source.

Snippet vu 30 983 fois - Téléchargée 19 fois

Contenu du snippet

Un simple Split en C++ (comme en PHP)...
Malheureusement je n'ai rien trouve de semblable sur le site...
Cette source utilise les conteneurs standards tels que les chaînes de caractères (string) et les tableaux à taille dynamique (vector)...
Et voila avec un petit exemple d'utilisation ...

Source / Exemple :


#include <iostream>
#include <vector>
#include <string>
#include <stdlib.h>

using namespace std;

int Split(vector<string>& vecteur, string chaine, char separateur)
{
	vecteur.clear();

	string::size_type stTemp = chaine.find(separateur);
	
	while(stTemp != string::npos)
	{
		vecteur.push_back(chaine.substr(0, stTemp));
		chaine = chaine.substr(stTemp + 1);
		stTemp = chaine.find(separateur);
	}
	
	vecteur.push_back(chaine);

	return vecteur.size();
}

int main()
{
	cout << "Test de split\n" << endl;

	string str = "Bonjour le monde ...";
	vector<string> VecStr;

	int nbTabl = Split(VecStr, str, ' ');

	cout << "Nb de parties : " << nbTabl << "\n" << endl;

	for(int i = 0; i < nbTabl; ++i)
	{
	    cout << i << " : '" << VecStr[i] << "'" << endl;
	}
	
	cout << endl;
	
	system("PAUSE");

	return 0;
}

Conclusion :


Résultats de la console :

Test de split

Nb de parties : 4

0 : 'Bonjour'
1 : 'le'
2 : 'monde'
3 : '...'

Appuyez sur une touche pour continuer...

A voir également

Ajouter un commentaire

Commentaires

Messages postés
126
Date d'inscription
samedi 24 avril 2004
Statut
Membre
Dernière intervention
6 janvier 2008

Je me suis trompe et personne ne s'en ai rendu compte :)
Pour vider le tableau dynamique, je met : vecteur[0].empty();
Ce qui est faux : empty renvoie un bool si les ocnteneur standard est vide.
Je voulais mettre vecteur[0].clear();
clear vide bien le tableau ... :)

Bonne prog
Colin CHARGY
Messages postés
229
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
20 août 2014

C'est sûr que si c'est pour parser un fichier au chargement ce n'est pas très critique niveau temps d'execution
par contre si ton "monde" commence à devenir vraiment grand avec un fichier de quelques Mo ça risque de faire un peu long ^__^
passer quelques minutes à optimiser ce genre de code t'apportera quelques connaissances niveau utilisation de la stl qui est très pratique

au cas où cela t'intéresses, il y a un très bon cours de C++ en français téléchargeable ici :
http://casteyde.christian.free.fr/cpp/cours/cours_cpp-1.40.6-html.zip
dont la partie II traites de la stl

ps: c'est un très bon livre que tu as entre les mains
Messages postés
126
Date d'inscription
samedi 24 avril 2004
Statut
Membre
Dernière intervention
6 janvier 2008

Salut,
Tout ce que tu dis est vrai ...
Ce code sert pour charger la contenu du monde dan un jeu durant le phase de chargement donc je suis pas à quelques millisecondes près...
Ceci dit, je suis inexcusable quand même puisque j'ai sous la main "Le language C++" de Bjarne Stroustrup dans lequel tout ceci est expliquer et en plus je l'ai lu...
Je n'ai pas l'habitude d'utiliser ni push, ni les itérateurs, ni find ...
Par contre, il est vrai que j'utilise des resize à tut bout de champs...

J'ai commencer par écrire cette fonction avec find, mais sans résultats, c'est pour cela que j'ai décider de faire caractère par caractère.

Quand j'aurais du temp, je la réécrirais en suivant tes conseils ...

Merci ^^
Colin CHARGY
Messages postés
229
Date d'inscription
dimanche 14 septembre 2003
Statut
Membre
Dernière intervention
20 août 2014

salut,
intéressante source mais je t'invite à quelques corrections :
- évites de passer un pointeur vers vctor en paramètre mais plutot une référence, cela t'évitera de faire un test que tu ne fais pas : vérifier que le pointeur passé en paramètre n'est pas nul
- c'est absurde d'utiliser des resize à tout bout de champs, tu ne connais pas la méthode push ? resize n'est à utiliser que si tu connais la taille de vector que tu veux
- normalement on parcours une string, un vector, ect... ce qu'on appelle les conteneurs de la stl avec des itérateurs
- pour trouver un caractère dans une string, la classe possède une méthode nommé find

voilà de quoi optimiser ton code ;-)
Messages postés
126
Date d'inscription
samedi 24 avril 2004
Statut
Membre
Dernière intervention
6 janvier 2008

Voili voilou...

On pourrait replacer tous les "->at(qqch)" par "[qqch]" pour accélérer le code mais enlever le contrôle des index ...

Il serait aussi intéressant de stocker "vecteur->size() - 1" dans une variable pour y accéder plus vite ...

Voilà

Colin CHARGY

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.